會話保持
- 定義
- Cookies
-
- Cookies資料
- 設定Cookies
- 代碼示例
- 原理詳解
- 練習
- session
- 練習session會話保持
定義
從打開浏覽器,輸入網址回車,傳回頁面,到關閉退出浏覽器,叫做完成了一次會話。
由于http 協定是無狀态的,無法保持會話狀态,使用者再次通路該網站時,又要重新認證。是以需要一種方法來保持會話狀态,避免重複的認證
保持會話有以下兩種存儲技術:
cookies
session
Cookies
在浏覽器端,開辟一塊存儲空間,将保持會話狀态的資料存儲在浏覽器端
Chrome -->開發者工具–>application–>Storage–>Cookies
FireFox–>開發者工具–>Storage–>Cookies
Cookies資料
- key-value鍵值對存儲,均為ASCII字元串
- 資料有過期時間,過期後自動删除,需重新認證
- 按域隔離存儲,不同的域間無法通路,不同的url 位址有不同的Cookies
- 每次通路網站時,将資料帶到服務端認證,Cookies過大會影響響應速度
設定Cookies
response.set_cookie(key,value,max_age=300,expires=“2021-05-03”)
key,value為具體資料
max_age最大過期時間的秒數
expires具體過期時間 日期字串
若不指定過期時間,關閉浏覽器時,資料丢失
代碼示例
#views.py
def index(request):
res = HttpResponse("設定 Cookies OK")
#設定Cookies
res.set_cookie("name","lauf",max_age=300)
#删除Cookies
#res.delete_cookie(key)
return res
#驗證浏覽器送出的Cookies資料
def validate(request):
cookies = request.Cookies #字典對象
name = cookies.get(name)
if name == "lauf":
return HttpResponse("處理請求")
else:
return HttpResponse("拒絕請求")
原理詳解
練習
1.配置一個路由 /login/
請求方式 :ajax發送POST請求,送出使用者的登入資料
視圖login:接收使用者的資料,并設定Cookies
response.set_cookie(“name”,"",max_age=300)
在浏覽器端檢視Cookies
2. 使用者再次通路/login/ 檢視效果
3. 删除浏覽器端的Cookies,在次通路/login/ 檢視效果
代碼
提取碼:ms7h
注意事項:
爬蟲使用Cookies登入
session
在服務端,開辟一塊存儲空間,存儲保持會話狀态的資料,傳回一個sessionid,存入Cookies
session的使用:
- 配置session
#settings.py
INSTALLED_APP = [
"django.contrib.sessions",
]
MIDDLEWARE = [
"django.contrib.sessions.middleware.SessionMiddleware"
]
SESSION_COOKIE_AGE = 3600 #sessionid在Cookies的過期時間
-
使用session
request.session[“name”] = user
request.session.get(“name”)
del request.session[“name”]
#views.py
from django.shortcuts import render,redirect
from django.http import HttpResponse
from django.http import HttpResponseRedirect
from django.http import JsonResponse
import json
def index(request):
#判斷使用者是否完成認證
session_ = request.session.get("name",None)
print("main page validate session",session_)
if session_ is None:
return render(request,"login.html")
else:
#已經認證,允許進入首頁
return render(request,"index.html")
def login(request):
if request.method == "GET":
# 判斷使用者是否完成認證
session_ = request.session.get("name", None)
print("login validate session:", session_)
#有session認證
if session_:
print("有session回話保持")
print(session_)
return redirect("/index/")
else:
#沒有session認證
print("第一次登入,無session")
return render(request,"login.html")
elif request.method == "POST":
print("接受到ajax的資料",request.body)
json_str = request.body
json_obj = json.loads(json_str)
user = json_obj.get("user")
pw = json_obj.get("pw")
#validate user & pw
#set session
request.session["name"] = user
res = JsonResponse({"code":200,"data":"登入成功"})
return res
-
過期的session資料
session 是存儲在服務端的資料庫中,浏覽器Cookies中的sessionid過期後,服務端的session資料不會自動删除,需要手動删除
python3 manage.py clearsessions
練習session會話保持
- GET 請求/index/ 首頁,服務端判斷是否有session會話保持,有則傳回首頁index.html,無則傳回login.html
- 使用者第一次登入後,服務端進行會話保持,短時間内使用者再次GET 請求/index/ 或者/login/ 直接跳轉到首頁index.html
完整代碼
提取碼:g099