天天看點

Django cookie 與 session

Cookie 是存儲在用戶端計算機上的文本檔案,并保留了各種跟蹤資訊。

識别傳回使用者包括三個步驟:

伺服器腳本向浏覽器發送一組 Cookie。例如:姓名、年齡或識别号碼等。

浏覽器将這些資訊存儲在本地計算機上,以備将來使用。

當下一次浏覽器向 Web 伺服器發送任何請求時,浏覽器會把這些 Cookie 資訊發送到伺服器,伺服器将使用這些資訊來識别使用者。

HTTP 是一種"無狀态"協定,這意味着每次用戶端檢索網頁時,用戶端打開一個單獨的連接配接到 Web 伺服器,伺服器會自動不保留之前用戶端請求的任何記錄。

但是仍然有以下三種方式來維持 Web 用戶端和 Web 伺服器之間的 session 會話:

一個 Web 伺服器可以配置設定一個唯一的 session 會話 ID 作為每個 Web 用戶端的 cookie,對于用戶端的後續請求可以使用接收到的 cookie 來識别。

在Web開發中,使用 session 來完成會話跟蹤,session 底層依賴 Cookie 技術。

Django cookie 與 session

設定 cookie:

擷取 cookie:

删除 cookie:

Django cookie 與 session
Django cookie 與 session

class UserInfo(models.Model):

    username = models.CharField(max_length=32)

    password = models.CharField(max_length=64)

Django cookie 與 session

from django.contrib import admin

from django.urls import path

from cookie import views

urlpatterns = [

    path('admin/', admin.site.urls),

    path('login/', views.login),

    path('index/', views.index),

    path('logout/', views.logout),

    path('order/', views.order)

Django cookie 與 session

def login(request):

    if request.method == "GET":

        return render(request, "login.html")

    username = request.POST.get("username")

    password = request.POST.get("pwd")

    user_obj = models.UserInfo.objects.filter(username=username, password=password).first()

    print(user_obj.username)

    if not user_obj:

        return redirect("/login/")

    else:

        rep = redirect("/index/")

        rep.set_cookie("is_login", True)

        return rep

def index(request):

    print(request.COOKIES.get('is_login'))

    status = request.COOKIES.get('is_login') # 收到浏覽器的再次請求,判斷浏覽器攜帶的cookie是不是登入成功的時候響應的 cookie

    if not status:

        return redirect('/login/')

    return render(request, "index.html")

def logout(request):

    rep = redirect('/login/')

    rep.delete_cookie("is_login")

    return rep # 點選登出後執行,删除cookie,不再儲存使用者狀态,并彈到登入頁面

def order(request):

    status = request.COOKIES.get('is_login')

    return render(request, "order.html")

以下建立三個模闆檔案:login.html、index.html、order.html。

<!DOCTYPE html>

<html lang="en">

<head>

<meta charset="UTF-8">

<title>Title</title>

</head>

<body>

<h3>使用者登入</h3>

<form action="" method="post">

{% csrf_token %}

<p>使用者名: <input type="text" name="username"></p>

<p>密碼: <input type="password" name="pwd"></p>

<input type="submit">

</form>

</body>

</html>

<h2>index 頁面。。。</h2>

<a href="/logout/">登出</a>

<h2>order 頁面。。。</h2>

運作結果如下圖所示:

Django cookie 與 session

伺服器在運作時可以為每一個使用者的浏覽器建立一個其獨享的 session 對象,由于 session 為使用者浏覽器獨享,是以使用者在通路伺服器的 web 資源時,可以把各自的資料放在各自的 session 中,當使用者再去通路該伺服器中的其它 web 資源時,其它 web 資源再從使用者各自的 session 中取出資料為使用者服務。

Django cookie 與 session

a. 浏覽器第一次請求擷取登入頁面 login。

b. 浏覽器輸入賬号密碼第二次請求,若輸入正确,伺服器響應浏覽器一個 index 頁面和一個鍵為 sessionid,值為随機字元串的 cookie,即 set_cookie ("sessionid",随機字元串)。

c. 伺服器内部在 django.session 表中記錄一條資料。

django.session 表中有三個字段。

session_key:存的是随機字元串,即響應給浏覽器的 cookie 的 sessionid 鍵對應的值。

session_data:存的是使用者的資訊,即多個 request.session["key"]=value,且是密文。

expire_date:存的是該條記錄的過期時間(預設14天)

d. 浏覽器第三次請求其他資源時,攜帶 cookie :{sessionid:随機字元串},伺服器從 django.session 表中根據該随機字元串取出該使用者的資料,供其使用(即儲存狀态)。

注意: django.session 表中儲存的是浏覽器的資訊,而不是每一個使用者的資訊。 是以, 同一浏覽器多個使用者請求隻儲存一條記錄(後面覆寫前面),多個浏覽器請求才儲存多條記錄。

cookie 彌補了 http 無狀态的不足,讓伺服器知道來的人是"誰",但是 cookie 以文本的形式儲存在浏覽器端,安全性較差,且最大隻支援 4096 位元組,是以隻通過 cookie 識别不同的使用者,然後,在對應的 session 裡儲存私密的資訊以及超過 4096 位元組的文本。

session 設定:

執行步驟:

a. 生成随機字元串

b. 把随機字元串和設定的鍵值對儲存到 django_session 表的 session_key 和 session_data 裡

c. 設定 cookie:set_cookie("sessionid",随機字元串) 響應給浏覽器

session 擷取:

a. 從 cookie 中擷取 sessionid 鍵的值,即随機字元串。

b. 根據随機字元串從 django_session 表過濾出記錄。

c. 取出 session_data 字段的資料。

session 删除,删除整條記錄(包括 session_key、session_data、expire_date 三個字段):

删除 session_data 裡的其中一組鍵值對:

a. 從 cookie 中擷取 sessionid 鍵的值,即随機字元串

b. 根據随機字元串從 django_session 表過濾出記錄

c. 删除過濾出來的記錄

建立路由:

from session import views as session_views

    path('session_login/', session_views.login),

    path('s_index/', session_views.s_index),

    path('s_logout/', session_views.s_logout),

]

Django cookie 與 session

建立視圖函數:

        return redirect("/session_login/")

        request.session['is_login'] = True

        request.session['user1'] = username

        return redirect("/s_index/")

def s_index(request):

    status = request.session.get('is_login')

        return redirect('/session_login/')

    return render(request, "s_index.html")

def s_logout(request):

   # del request.session["is_login"] # 删除session_data裡的一組鍵值對

    request.session.flush() # 删除一條記錄包括(session_key session_data expire_date)三個字段

    return redirect('/session_login/')

模闆檔案:

<h2>session_index 頁面。。。{{ request.session.user1 }}</h2>

<a href="/s_logout/">登出</a>

Django cookie 與 session