Cookie 是存儲在用戶端計算機上的文本檔案,并保留了各種跟蹤資訊。
識别傳回使用者包括三個步驟:
伺服器腳本向浏覽器發送一組 Cookie。例如:姓名、年齡或識别号碼等。
浏覽器将這些資訊存儲在本地計算機上,以備将來使用。
當下一次浏覽器向 Web 伺服器發送任何請求時,浏覽器會把這些 Cookie 資訊發送到伺服器,伺服器将使用這些資訊來識别使用者。
HTTP 是一種"無狀态"協定,這意味着每次用戶端檢索網頁時,用戶端打開一個單獨的連接配接到 Web 伺服器,伺服器會自動不保留之前用戶端請求的任何記錄。
但是仍然有以下三種方式來維持 Web 用戶端和 Web 伺服器之間的 session 會話:
一個 Web 伺服器可以配置設定一個唯一的 session 會話 ID 作為每個 Web 用戶端的 cookie,對于用戶端的後續請求可以使用接收到的 cookie 來識别。
在Web開發中,使用 session 來完成會話跟蹤,session 底層依賴 Cookie 技術。

設定 cookie:
擷取 cookie:
删除 cookie:
class UserInfo(models.Model):
username = models.CharField(max_length=32)
password = models.CharField(max_length=64)
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)
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>
運作結果如下圖所示:
伺服器在運作時可以為每一個使用者的浏覽器建立一個其獨享的 session 對象,由于 session 為使用者浏覽器獨享,是以使用者在通路伺服器的 web 資源時,可以把各自的資料放在各自的 session 中,當使用者再去通路該伺服器中的其它 web 資源時,其它 web 資源再從使用者各自的 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),
]
建立視圖函數:
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>