Django(part50)--Web請求認證

學習筆記,僅供參考




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/發起請求:

出現登錄頁面,也就是說,當前我們的並沒有登錄管理員賬號。

現在,我們向http://127.0.0.1:8000/myuser/login/發起請求,並登錄:

登錄成功後,我們再刷新一下admin數據庫後臺管理系統:

發現我們已經登錄啦!這是因爲我們用login函數登錄後,我們的賬號信息就保存在了session中,此時,我們就處於登錄狀態了。

現在,我們向http://127.0.0.1:8000/myuser/logout/發起訪問,再刷新一下admin數據庫後臺管理系統:

我們發現,我們的管理員賬號已經被登出了。


  • 舉個例子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/發起請求,並填入註冊信息:

點擊註冊:

查看mybookstore數據庫中的auth_user數據表:

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)

可以看到,我們的數據表中多了一條普通用戶的賬號記錄。需要注意的是,普通用戶是不可以登錄到admin數據庫後臺管理界面的。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章