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)能夠順利。
操作演示
編寫一個方法,用于注冊用戶的賬號和密碼。
編寫一個方法,用于登錄用戶的賬號和密碼,并且登錄的時候綁定一個加密的參數(shù)在cookie上,并且該加密參數(shù)也存儲在服務(wù)端中。
3)在以后的任意一個請求,我們都獲取request中的cookies,查看cookie中綁定的參數(shù)是否合法,以及查詢是否在服務(wù)端存儲了。
4)如果驗證成功則返回請求url的結(jié)果信息到頁面,如果驗證失敗則返回錯誤提醒信息頁面
- 注銷登錄
6)定義裝飾器去驗證用戶登錄以后才執(zhí)行對應(yīng)的視圖函數(shù),反之跳轉(zhuǎn)到登錄頁面中
1. 注冊方法
從頁面中獲取賬號和密碼,進行創(chuàng)建

2. 登錄,并且綁定參數(shù)到cookie上
先檢驗用戶名是否在數(shù)據(jù)庫中,如果查詢到則繼續(xù)驗證密碼, 如果密碼驗證對,則綁定一個參數(shù)到cookie中。 解析密碼,加密密碼來源與一下的模塊:
from django.contrib.auth.hashersimportcheck_password,make_password

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

4. 注銷登錄
刪除cookie中的認證令牌

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

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ù)即可

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

2. 實現(xiàn)登錄方法
2.1 登錄頁面提交登錄的字段

2.2 后端進行登錄的驗證

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

中間件
中間件:
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 處理流程

1.3 自定義中間件流程
在工程目錄下創(chuàng)建middleware目錄
目錄中創(chuàng)建一個python文件
在根據(jù)功能需求,創(chuàng)建切入需求類,重寫切入點方法
from django.utils.deprecation import MiddlewareMixin class AuthUserMiddleWare(MiddlewareMixin): def process_request(self, request): print(‘xxxx’)啟動中間件,在settings中進行配置,MIDDLEWARE中添加middleware.文件名.類名
