天天看點

刨析django---會話保持定義Cookiessession練習session會話保持

會話保持

  • 定義
  • Cookies
    • Cookies資料
    • 設定Cookies
    • 代碼示例
    • 原理詳解
    • 練習
  • session
  • 練習session會話保持

定義

從打開浏覽器,輸入網址回車,傳回頁面,到關閉退出浏覽器,叫做完成了一次會話。

由于http 協定是無狀态的,無法保持會話狀态,使用者再次通路該網站時,又要重新認證。是以需要一種方法來保持會話狀态,避免重複的認證

保持會話有以下兩種存儲技術:

cookies

session

Cookies

在浏覽器端,開辟一塊存儲空間,将保持會話狀态的資料存儲在浏覽器端

Chrome -->開發者工具–>application–>Storage–>Cookies

FireFox–>開發者工具–>Storage–>Cookies

Cookies資料

  1. key-value鍵值對存儲,均為ASCII字元串
  2. 資料有過期時間,過期後自動删除,需重新認證
  3. 按域隔離存儲,不同的域間無法通路,不同的url 位址有不同的Cookies
  4. 每次通路網站時,将資料帶到服務端認證,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("拒絕請求")
           

原理詳解

刨析django---會話保持定義Cookiessession練習session會話保持

練習

1.配置一個路由 /login/

請求方式 :ajax發送POST請求,送出使用者的登入資料

視圖login:接收使用者的資料,并設定Cookies

response.set_cookie(“name”,"",max_age=300)

在浏覽器端檢視Cookies

2. 使用者再次通路/login/ 檢視效果

3. 删除浏覽器端的Cookies,在次通路/login/ 檢視效果

代碼

提取碼:ms7h

注意事項:

刨析django---會話保持定義Cookiessession練習session會話保持

爬蟲使用Cookies登入

刨析django---會話保持定義Cookiessession練習session會話保持

session

在服務端,開辟一塊存儲空間,存儲保持會話狀态的資料,傳回一個sessionid,存入Cookies

刨析django---會話保持定義Cookiessession練習session會話保持

session的使用:

  1. 配置session
#settings.py

INSTALLED_APP = [
	"django.contrib.sessions",
]
MIDDLEWARE = [
	"django.contrib.sessions.middleware.SessionMiddleware"
]

SESSION_COOKIE_AGE = 3600 #sessionid在Cookies的過期時間

           
  1. 使用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

           
  1. 過期的session資料

    session 是存儲在服務端的資料庫中,浏覽器Cookies中的sessionid過期後,服務端的session資料不會自動删除,需要手動删除

python3 manage.py clearsessions
           

練習session會話保持

  1. GET 請求/index/ 首頁,服務端判斷是否有session會話保持,有則傳回首頁index.html,無則傳回login.html
  2. 使用者第一次登入後,服務端進行會話保持,短時間内使用者再次GET 請求/index/ 或者/login/ 直接跳轉到首頁index.html

完整代碼

提取碼:g099

繼續閱讀