1. 程式人生 > >[py][mx]django的cookie和session操作

[py][mx]django的cookie和session操作

即使 turn 瀏覽器 會話 ext 問題 控制 put 實現

這玩意可以實現7天免登錄等功能.

session和cookie機制原理和交互過程

交互過程

① 客戶端訪問,無服務端寫入的Cookie
② 服務端的Cookie寫入瀏覽器
③ 瀏覽器解析Cookie,保存至瀏覽器文件
④ 客戶端訪問,有服務端寫入的Cookie
⑤ 服務器獲取

技術分享圖片

django請求中的cookie

第一次訪問服務端會給一個csrf的cookie
技術分享圖片

登錄完成後,默認給一個為期半個月的cookie 用於訪問別的也沒使用.
技術分享圖片
技術分享圖片

django中cookie與session的實現原理

app默認註冊了攔截器session, 瀏覽器的request先過這個攔截器後,走views邏輯
技術分享圖片

之後django_session表裏會維護一個記錄.

技術分享圖片

技術分享圖片

django session設置

Django中操作session:

  獲取session:request.session[key]     request.session.get(key)
  設置session:reqeust.session[key] = value
  刪除session:del request[key]

技術分享圖片

users/views.py

def login(request):
    if request.method == "POST":
        username = request.POST.get("username")
        password = request.POST.get("password")
        if username == "maotai" and password == "123456":
            request.session['name'] = "maotai-session" #定義一個session key
            request.session['name2'] = "maotai2-session"#定義一個session key

            name = request.session.get("name", "") # 獲取一個session key
            name2 = request.session.get("name2", "")
            # return redirect("/")
            return render(request, "index.html", {"name": name, "name2": name2}) #將session key返回到前端
        else:
            return render(request, "login.html")
    elif request.method == "GET":
        return render(request, "login.html")

登錄系統
技術分享圖片

可以看到設置了一個cookie字段, 可見我後端無論設置多個session key, 都給前端返回一個cookie

這裏我設置了2個
            request.session['name'] = "maotai-session" #定義一個session key
            request.session['name2'] = "maotai2-session"#定義一個session key

點登錄可以獲取到key.

templates/login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>login</title>
</head>
<body>
<div>
    <form action="/login/" method="post">
        <p><input type="text" placeholder="username" name="username"></p>
        <p><input type="text" placeholder="password" name="password"></p>
        <p><input type="submit"></p>
        {% csrf_token %}
    </form>
</div>
</body>
</html>

django cookie默認15天過期時間設置 settings.py

cookie可以有過期時間,這樣瀏覽器就知道什麽時候可以刪除cookie了。

如果cookie沒有設置過期時間,當用戶關閉瀏覽器的時候,cookie就自動過期了。

你可以改變 SESSION_EXPIRE_AT_BROWSER_CLOSE 的設置來控制session框架的這一行為。

缺省情況下, SESSION_EXPIRE_AT_BROWSER_CLOSE 設置為 False ,這樣,會話cookie可以在用戶瀏覽器中保持有效達 SESSION_COOKIE_AGE 秒(缺省設置是兩周,即1,209,600 秒)。

如果你不想用戶每次打開瀏覽器都必須重新登陸的話,用這個參數來幫你。如果 SESSION_EXPIRE_AT_BROWSER_CLOSE 設置為 True ,當瀏覽器關閉時,Django會使cookie失效。

技術分享圖片

如果SESSION_EXPIRE_AT_BROWSER_CLOSE 設置為true的話,則每次關閉瀏覽器打開都得重新登錄. 默認是false,即每次不必重新登錄.

發現個小問題,即使每次重新登錄, django_session裏的session的舊記錄仍然存在.
技術分享圖片

[py][mx]django的cookie和session操作