天天看点

Django(part50)--Web请求认证

学习笔记,仅供参考

文章目录

  • ​​Web请求认证​​
  • ​​用户认证authenticate​​
  • ​​用户登录login​​
  • ​​用户登出logout​​
  • ​​举个例子​​

Web请求认证

  • 相关函数
from django.contrib.auth import authenticate, login, logout      

用户认证authenticate

  • 函数用法
authenticate(username='用户名', password='原始密码')      

该函数可以验证用户名和密码是否合法,如果合法则返回User模型类的对象,如果不合法返回None

  • 官方示例
from django.contrib.auth import authenticate
user = authenticate(username='john', password='secret')
if user is not None:
    # 通过认证
else:
    # 没有通过认证      

在这个函数中,它不仅检查了我们输入的用户名和密码是否和存储的相匹配,还检查了id_active是否为True。

用户登录login

  • 函数用法
login(request, user)
#user为User模型类创建的用户对象
#request为HttpRequest对象      

该方法使用Django的session框架,将用户的信息保存在session中。

  • 示例
from django.contrib.auth import authenticate, login

def login_view(request):
    username = request.POST['username']
    password = request.POST['password']
    user = authenticate(request, username=username, password=password)
    if user is not None:
        login(request, user)
        #用户的信息保存在session中
        # 重新指定登陆成功页
    else:
        # 返回一个无效的登陆信息      

用户登出logout

  • 函数用法
logout(request)      

通过​

​django.contrib.auth.login()​

​​登入的用户,可以使用​

​django.contrib.auth.logout()​

​退出登陆

  • 示例
from django.contrib.auth import logout

def logout_view(request):
    logout(request)      

举个例子

  • 举个例子1

现在,我们用我们的admin管理员账号来演示用户认证,用户登录和用户登出.

在myuser应用下的views.py模块中,我们创建两个视图处理函数,用于用户认证、用户登录和用户登出:

from django.shortcuts import render
from django.http import HttpResponse
from django.contrib.auth import models
from django.contrib.auth import authenticate, login, logout
# Create your views here.




def mylogin(request):
    if request.method == "GET":
        return render(request, 'myuser/login.html', locals())
    elif request.method == "POST":
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        try:
            user = authenticate(username = username,
                                password = password)
            if user is not None:
                login(request, user)
#                print(request.session)
                return HttpResponse("登陆成功...")
            else:
                return HttpResponse("登录失败...")
        except:
            return HttpResponse("没有此用户...")

def mylogout(request):
#    print("mylogout运行了...")
    logout(request)
    return HttpResponse("退出登录...")      

在myuser应用下的urls.py模块中,我们创建两个路由:

from django.urls import re_path
from . import views

urlpatterns = [
        re_path(r'^login/$', views.mylogin),
        re_path(r'^logout/$', views.mylogout),
]      

现在,我们向admin数据库后台管理系统http://127.0.0.1:8000/admin/发起请求:

Django(part50)--Web请求认证

出现登录页面,也就是说,当前我们的并没有登录管理员账号。

现在,我们向http://127.0.0.1:8000/myuser/login/发起请求,并登录:

Django(part50)--Web请求认证

登录成功后,我们再刷新一下admin数据库后台管理系统:

Django(part50)--Web请求认证

发现我们已经登录啦!这是因为我们用login函数登录后,我们的账号信息就保存在了session中,此时,我们就处于登录状态了。

现在,我们向http://127.0.0.1:8000/myuser/logout/发起访问,再刷新一下admin数据库后台管理系统:

Django(part50)--Web请求认证

我们发现,我们的管理员账号已经被登出了。

  • 举个例子2

现在,我么基于上一个例子的代码,写一个注册界面。

首先,我们在myuser应用的urls.py文件中,添加1个路由:

from django.urls import re_path
from . import views

urlpatterns = [
        re_path(r'^login/$', views.mylogin),
        re_path(r'^logout/$', views.mylogout),
        re_path(r'^reg/$', views.myreg),
]      

在在myuser应用的views.py模块中,添加一个视图函数:

def myreg(request):
    if request.method == "GET":
        return render(request, 'myuser/register.html')
    elif request.method == "POST":
        username = request.POST.get('username', '')
        password = request.POST.get('password', '')
        #这里我们先不做用户认证
        
        try:
            user = models.User.objects.create_user(
                    username = username,
                    password = password
                    )
            user.save()
            return HttpResponse("注册成功...")
        except:
            return HttpResponse("注册失败...")      

现在,我们向http://127.0.0.1:8000/myuser/reg/发起请求,并填入注册信息:

Django(part50)--Web请求认证

点击注册:

Django(part50)--Web请求认证
mysql> select id, username, email, is_superuser from auth_user;
+----+------------+----------------------+--------------+
| id | username   | email                | is_superuser |
+----+------------+----------------------+--------------+
|  1 | goatbishop | [email protected] |            1 |
|  2 | darkgoat   |                      |            0 |
+----+------------+----------------------+--------------+
2 rows in set (0.01 sec)