django四、中間件、session與cookie實現(xiàn)登錄注冊

session cookie

會話技術(shù),比如在做登錄功能的時候,需要配合是用存儲在客戶端的cookie信息,以及存儲在服務(wù)端的session來實現(xiàn)登錄功能。 在cookie中保存了用戶的信息,特別是一個特殊的令牌信息,當(dāng)用戶拿著這個特殊的令牌來訪問網(wǎng)站的時候,網(wǎng)站會從cookie中 獲取這個特殊令牌去數(shù)據(jù)庫session中去查詢是否有這個對應(yīng)的令牌的信息,如果有則驗證成功,就可以把用戶的信息返回給客戶端 了,如果驗證失敗則提示用戶沒有登錄等等提示信息。

1. cookie

1.1 描述
瀏覽器端的回話技術(shù)
cookie本身由瀏覽器生成,通過Response將cookie寫在瀏覽器上,下一次訪問,瀏覽器會根據(jù)不同的規(guī)則攜帶cookie過來

1.2 設(shè)置cookie
    response.set_cookie(key, value, max_age=None, exprise=None)
    request.GET.get(key)

注意:cookie不能跨瀏覽器

參數(shù)定義:

    max_age :  整數(shù),指定cookie過期時間,以秒為單位
    exprise: 整數(shù),指定過期時間,還支持是一個datetime或者timedelta,可以指定一個具體日期時間
    max_age和exprise兩個選一個指定
    過期時間的幾個關(guān)鍵時間
    max_age設(shè)置為0瀏覽器關(guān)閉失效
    設(shè)置位None永不過期
    exprise=timedelta(days=10) 10天后過期


2. session

2.1 描述
服務(wù)端會話技術(shù),依賴于cookie

2.2 開啟session設(shè)置

1)django中啟用SESSION 在settings中修改如下地方

    INSTALLED_APPS:
        ‘django.contrib.sessions’
    MIDDLEWARE:
        ‘django.contrib.sessions.middleware.SessionMiddleware’

每個HttpResponse對象都有一個session屬性,也是一個類字典對象 講解cookie和session通信,session_id等

2.3 常用操作

get(key, default=None) 根據(jù)鍵獲取會話的值 clear() 清除所有會話 flush() 刪除當(dāng)前的會話數(shù)據(jù)并刪除會話的cookie delete request[‘session_id’] 刪除會話 session.session_key 獲取session的key 設(shè)置數(shù)據(jù) request.session[‘user’] = username 數(shù)據(jù)存儲到數(shù)據(jù)庫中會進行編碼使用的是base64 注意: Session 支持中文 cookie不支持中文 token自己維護

登錄注冊

通過cookie和token去實現(xiàn)登錄功能,用戶在登錄賬號以后,隨機產(chǎn)生一個隨機數(shù)并存在cookie中,并在服務(wù)端也存儲同一個數(shù)在數(shù)據(jù)庫中。 當(dāng)下一次url請求過來的時候,解析request中綁定的cookie信息,解鎖出之前存的隨機數(shù),判斷該隨機數(shù)是否是存儲在服務(wù)器端的數(shù)據(jù),如果 沒有查詢到則表示該cookie過期,或者該cookie是偽造的,或者服務(wù)器上存儲該信息的數(shù)據(jù)緩存到期被清空了。則該提示用戶重新登錄,并且 重新產(chǎn)生隨機數(shù),并存儲在cookie中以及服務(wù)端,以保證下次請求和響應(yīng)能夠順利。

操作演示

  1. 編寫一個方法,用于注冊用戶的賬號和密碼。

  2. 編寫一個方法,用于登錄用戶的賬號和密碼,并且登錄的時候綁定一個加密的參數(shù)在cookie上,并且該加密參數(shù)也存儲在服務(wù)端中。

3)在以后的任意一個請求,我們都獲取request中的cookies,查看cookie中綁定的參數(shù)是否合法,以及查詢是否在服務(wù)端存儲了。

4)如果驗證成功則返回請求url的結(jié)果信息到頁面,如果驗證失敗則返回錯誤提醒信息頁面

  1. 注銷登錄

6)定義裝飾器去驗證用戶登錄以后才執(zhí)行對應(yīng)的視圖函數(shù),反之跳轉(zhuǎn)到登錄頁面中

1. 注冊方法

從頁面中獲取賬號和密碼,進行創(chuàng)建

image.png

2. 登錄,并且綁定參數(shù)到cookie上

先檢驗用戶名是否在數(shù)據(jù)庫中,如果查詢到則繼續(xù)驗證密碼, 如果密碼驗證對,則綁定一個參數(shù)到cookie中。 解析密碼,加密密碼來源與一下的模塊:

from django.contrib.auth.hashersimportcheck_password,make_password
image.png

3. 在方法中驗證cookie中傳遞的參數(shù)是否正確

cookie是在用戶提交url請求的時候都會帶上的一個參數(shù),所以可以從中獲取到我們設(shè)置的參數(shù),并且在服務(wù)端進行驗證,看服務(wù)端有這個標識符沒有, 如果能查詢到,則表示用戶登錄過了,并且還在登錄時效內(nèi),則直接返回用戶提交url對應(yīng)的響應(yīng)。如果在服務(wù)端沒有查詢到數(shù)據(jù),則表示標識符過期, 或者無效了,需要登錄了,則直接提示錯誤信息即可!

image.png

4. 注銷登錄

刪除cookie中的認證令牌

image.png

5. 通過定義裝飾器去驗證用戶是否是登錄狀態(tài),如果不是,則跳轉(zhuǎn)到登錄

定義裝飾器--閉包

image.png

django自帶的登錄注冊

在django中,django幫我們封裝好了登錄注冊以及注銷的函數(shù),在下面的代碼案例中,我們將使用django定義好的注冊登錄注銷函數(shù)去實現(xiàn)用戶的登錄驗證,用戶登錄,以及用戶注銷等操作,以及定義login_rqueired裝飾器,去裝飾我們定義的函數(shù),實現(xiàn)登錄才能處理對應(yīng)的業(yè)務(wù)邏輯

1. 實現(xiàn)注冊方法

1.1 頁面提交注冊字段

在頁面的form中有一下三個字段,用戶名和密碼1和密碼2,頁面在submit提交的時候,會提交該三個字段后后端,在后端中獲取該參數(shù)即可

image.png

1.2 后端處理注冊的信息

后端獲取前端傳遞的參數(shù),進行簡單的驗證后,進行創(chuàng)建用戶的信息

image.png

2. 實現(xiàn)登錄方法

2.1 登錄頁面提交登錄的字段

image.png

2.2 后端進行登錄的驗證

image.png

3. 實現(xiàn)注銷方法

image.png

中間件

中間件:

a) 是一個輕量級的,底層的插件,可以介入Django的請求和響應(yīng)的過程(面向切面編程)

b) 中間件的本質(zhì)就是一個python類

c) 面向切面編程(Aspect Oriented Programming)簡稱AOP,AOP的主要實現(xiàn)目的是針對業(yè)務(wù)處理過程中的切面進行提取,它所面對的是處理過程中的某個步驟或階段,以獲取邏輯過程中各部分之間低耦合的隔離效果

1.1 中間件的處理函數(shù)
__init__:沒有參數(shù),在服務(wù)器響應(yīng)的第一個請求的時候自動調(diào)用,用戶確定時候啟動該中間件

process_request(self, request): 在執(zhí)行視圖前被調(diào)用,每個請求上都會被調(diào)用,不主動進行返回或返回HttpResponse對象

process_view(self, request, view_func,view_args, view_kwargs):調(diào)用視圖之前執(zhí)行,每個請求都會調(diào)用,不主動進行返回或返回HttpResponse對象

process_template_response(self, request, response):在視圖剛好執(zhí)行完后進行調(diào)用,每個請求都會調(diào)用,不主動進行返回或返回HttpResponse對象

process_response(self, request, response):所有響應(yīng)返回瀏覽器之前調(diào)用,每個請求都會調(diào)用,不主動進行返回或返回HttpResponse對象

process_exception(self, request, exception):當(dāng)視圖拋出異常時調(diào)用,不主動進行返回或返回HttpResponse對象

1.2 處理流程
image.png
1.3 自定義中間件流程
  1. 在工程目錄下創(chuàng)建middleware目錄

  2. 目錄中創(chuàng)建一個python文件

  3. 在根據(jù)功能需求,創(chuàng)建切入需求類,重寫切入點方法

  4.  from django.utils.deprecation import MiddlewareMixin
    
     class AuthUserMiddleWare(MiddlewareMixin):
    
         def process_request(self, request):
    
            print(‘xxxx’)
    
    
  5. 啟動中間件,在settings中進行配置,MIDDLEWARE中添加middleware.文件名.類名

image.png
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容