Django - cookies 會話跟蹤技術
一、HTTP協議的無狀態儲存
兩次請求之間沒有關聯
會話理解為客戶端與伺服器之間的一次會晤,在一次會晤中可能會包含多次請求和響應
2、會話路徑技術使用Cookie或session完成
我們知道HTTP協議是無狀態協議,也就是說每個請求都是獨立的!無法記錄前一次請求的狀態。
但HTTP協議中可以使用Cookie來完成會話跟蹤!在Web開發中,使用session來完成會話跟蹤,session底層依賴Cookie技術。
二、cookie簡介
1、什麼叫Cookie
Cookie翻譯成中文是小甜點,小餅乾的意思。在HTTP中它表示伺服器送給客戶端瀏覽器的小甜點。其實Cookie是key-value結構
隨著伺服器端的響應傳送給客戶端瀏覽器。然後客戶端瀏覽器會把Cookie儲存起來,當下一次再訪問伺服器時把Cookie再發送給伺服器。 Cookie是由伺服器建立
,然後通過響應傳送給客戶端的一個鍵值對。客戶端會儲存Cookie,並會標註出Cookie的來源(哪個伺服器的Cookie)。當客戶端向伺服器發出請求時會把所有
這個伺服器Cookie包含在請求中傳送給伺服器,這樣伺服器就可以識別客戶端了!
Cookie規範
- Cookie大小上限為4KB;
- 一個伺服器最多在客戶端瀏覽器上儲存20個Cookie;
- 一個瀏覽器最多儲存300個Cookie;
上面的資料只是HTTP的Cookie規範,但在瀏覽器大戰的今天,一些瀏覽器為了打敗對手,為了展現自己的能力起見,可能對Cookie規範“擴充套件”了一些,例如每個Cookie的大小為8KB,最多可儲存500個Cookie等!但也不會出現把你硬碟佔滿的可能!
注意,不同瀏覽器之間是不共享Cookie的。也就是說在你使用IE訪問伺服器時,伺服器會把Cookie發給IE,然後由IE儲存起來,當你在使用FireFox訪問伺服器時,不可能把IE儲存的Cookie傳送給伺服器。
Cookie與HTTP頭
Cookie是通過HTTP請求和響應頭在客戶端和伺服器端傳遞的:
- Cookie:請求頭,客戶端傳送給伺服器端;
- 格式:Cookie: a=A; b=B; c=C。即多個Cookie用分號離開; Set-Cookie:響應頭,伺服器端傳送給客戶端;
- 一個Cookie物件一個Set-Cookie: Set-Cookie: a=A Set-Cookie: b=B Set-Cookie: c=C
Cookie的覆蓋
如果伺服器端傳送重複的Cookie那麼會覆蓋原有的Cookie,例如客戶端的第一個請求伺服器端傳送的Cookie是:Set-Cookie: a=A;第二請求伺服器端傳送的是:Set-Cookie: a=AA,那麼客戶端只留下一個Cookie,即:a=AA。
程式碼實現
判斷使用者之間是否登陸過,沒有首頁,有就顯示訪問頁面
modles
from django.db import models class UserInfo(models.Model): username = models.CharField(max_length=32) password = models.CharField(max_length=32)
資料庫遷移
python manage.py makemigrations
python manage.py migrate
事先存入資料
views.py
from django.shortcuts import render,HttpResponse # Create your views here. from app01.models import UserInfo def login(request): if request.method=='POST': username=request.POST.get('user') pwd=request.POST.get('pwd') user=UserInfo.objects.filter(username=username,password=pwd).first() if user: """ 響應體: 都是HttpResponse()例項物件 :return HttpResponse() :return render() :return redirect() """ response=HttpResponse('登入成功') response.set_cookie('is_login',True) response.set_cookie('username',user.username) return response return render(request,'login.html') def index(request): print(request.COOKIES)
is_login=request.COOKIES.get('is_login') username=request.COOKIES.get('username') if is_login: return render(request,'index.html',locals()) else: 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 %} 使用者名稱<input type="text" name="user"> 密碼<input type="text" name="pwd"> <input type="submit" value="submit"> </form> </body> </html>
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>{{ username }} welcome to index</h3> </body> </html>
先登陸login後,伺服器儲存cookies
再次請求時,根據cookies進行判斷是否登陸成功
總結
設定cookies
取cookies
1、一次登陸,成功,再登陸就帶著這個cookies
2、換一個瀏覽器,在訪問就是一個新的
3、訪問其他網站京東,