python Django cookie和session
在一個會話的多個請求中共享數據,這就是會話跟蹤技術。例如在一個會話中的請求如下: 請求銀行主頁;
- 請求登錄(請求參數是用戶名和密碼);
- 請求轉賬(請求參數與轉賬相關的數據);
- 請求信譽卡還款(請求參數與還款相關的數據)。
在這上會話中當前用戶信息必須在這個會話中共享的,因為登錄的是張三,那麽在轉賬和還款時一定是相對張三的轉賬和還款!這就說明我們必須在一個會話過程中有共享數據的能力。
會話一定是反復的溝通,至於多少次,沒有上限!
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