天天看點

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)