1. 程式人生 > >python Django cookie和session

python Django cookie和session

首頁 shortcuts ESS 技術分享 color dex 當前 red from

在一個會話的多個請求中共享數據,這就是會話跟蹤技術。例如在一個會話中的請求如下: 請求銀行主頁;

  • 請求登錄(請求參數是用戶名和密碼);
  • 請求轉賬(請求參數與轉賬相關的數據);
  • 請求信譽卡還款(請求參數與還款相關的數據)。

在這上會話中當前用戶信息必須在這個會話中共享的,因為登錄的是張三,那麽在轉賬和還款時一定是相對張三的轉賬和還款!這就說明我們必須在一個會話過程中有共享數據的能力。

會話一定是反復的溝通,至於多少次,沒有上限!

HTTP是無狀態保存
簡單來講,HTTP要求瀏覽器對服務器的請求,每一個請求,對於服務器而言,都是新的請求
服務器,並不知道瀏覽器是誰。

2. 會話路徑技術使用Cookie或session完成

我們知道HTTP協議是無狀態協議,也就是說每個請求都是獨立的!無法記錄前一次請求的狀態。但HTTP協議中可以使用Cookie來完成會話跟蹤!在Web開發中,使用session來完成會話跟蹤,session底層依賴Cookie技術.

什麽叫Cookie

Cookie是key-value結構,類似於一個python的字典 ,隨著服務器端的響應發送給客戶端瀏覽器,然後客戶端瀏覽器會把Cookie保存起來,當下一次訪問服務器時把cookie再發給服務器.

cookie是由服務器創建,然後通過響應發送給客戶端的一個鍵值對

客戶端會保存Cookie,並會標記出Cookie的來源(哪個服務器)

當客戶端想服務器發出請求時會把所有這個服務器的Cookie包 在請求中發送給服務器,這樣服務器就可以識別客戶端

技術分享圖片

Cookie規範

  • Cookie大小上限為4KB;
  • 一個服務器最多在客戶端瀏覽器上保存20個Cookie;
  • 一個瀏覽器最多保存300個Cookie;

每一個客戶端瀏覽器,都有一個cookie容器。

cookie:針對一個服務器,保存在客戶端某一個瀏覽器上的key-value存儲的數據結構中

服務器有權利向瀏覽器寫入cookie
一旦寫入cookie,那麽下次訪問,會帶著cookie去訪問服務器

比如電腦的谷歌瀏覽器和火狐瀏覽器,各自有獨立的cookie容器,不能相互訪問!

request是客戶端請求,response是服務端響應。
讀取客戶端的cookies要用request的,但是要寫入客戶端cookies就要用response

urls.py

urlpatterns = [
    # url(r‘^admin/‘, admin.site.urls),
    url(r^login/, views.login),
    url(r^index/, views.index),
]

views.py

from django.shortcuts import render, HttpResponse, redirect
from django.urls import reverse
import datetime

# Create your views here.
def index(request):
    print(request.COOKIES)  # 打印cookie
    is_login = request.COOKIES.get("is_login")
    if not is_login:
        return redirect("/login/")
    username =request.COOKIES.get("username")#獲取cookies的username值
    time=request.COOKIES.get("login_time")
    return render(request, "index.html",{"username":username,"login_time":time})

def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        if user == "zaizai" and pwd == "123":
            obj = redirect("/index/")  # 302重定向登陸頁面
            # obj.set_cookie("is_login", True)
            obj.set_cookie("is_login", True, 5)  # cookie設置登陸狀態  設置為5秒鐘,cookie失效
            obj.set_cookie("username", user, 5)  # cookie設置用戶名
            #獲取當前時間
            now=datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
            obj.set_cookie("login_time",now)
            return obj
    return render(request, "login.html")

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="" method="post">
    {% csrf_token %}
    <lable>用戶名</lable>
    <input type="text" name="user">
    <lable>密碼</lable>
    <input type="password" name="pwd">
    <input type="submit">
</form>
</body>
</html>

index.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<h3>{{ username }}個人首頁,登陸時間{{ login_time }}</h3>
</body>
</html>

跳轉首頁後,瘋狂的刷新頁面。5秒後,會自動調轉到登錄頁面

效果如下:

技術分享圖片

python Django cookie和session