Django中cookie&session的實現
1.什麽叫Cookie
Cookie翻譯成中文是小甜點,小餅幹的意思。在HTTP中它表示服務器送給客戶端瀏覽器的小甜點。其實Cookie是key-value結構,類似於一個python中的字典。隨著服務器端的響應發送給客戶端瀏覽器。然後客戶端瀏覽器會把Cookie保存起來,當下一次再訪問服務器時把Cookie再發送給服務器。 Cookie是由服務器創建,然後通過響應發送給客戶端的一個鍵值對。客戶端會保存Cookie,並會標註出Cookie的來源(哪個服務器的Cookie)。當客戶端向服務器發出請求時會把所有這個服務器Cookie包含在請求中發送給服務器,這樣服務器就可以識別客戶端了!
Cookie的覆蓋
如果服務器端發送重復的Cookie那麽會覆蓋原有的Cookie,例如客戶端的第一個請求服務器端發送的Cookie是:Set-Cookie: a=A;第二請求服務器端發送的是:Set-Cookie: a=AA,那麽客戶端只留下一個Cookie,即:a=AA。
設置Cookie:
1 1 request.set_COOKIES
獲取Cookie
1 request.COOKIES
刪除cookie:
1 response.delete_cookie("cookie_key",path="/",domain=name)
小實例:
1View Codedef index(request): 2 print("cookie---->""request.COOKIES", request.COOKIES) 3 is_login = request.COOKIES.get("is_login") 4 username = request.COOKIES.get("username") 5 if not is_login: 6 return redirect("/login_cookie") 7 else: 8 return render(request,"index.html") 9 10 11 def login_cookie(request): 12 if request.method == "POST": 13 info = request.POST 14 user_name = info.get("user") 15 password = info.get("pwd") 16 check_user = models.UserInfo.objects.filter(name=user_name, password=password).first() 17 print(check_user) 18 if check_user: 19 obj = HttpResponse("TRUE") 20 obj.set_cookie("is_login",True) 21 obj.set_cookie("username", user_name) 22 return obj 23 else: 24 return HttpResponse("") 25 else: 26 return render(request,"login.html")
整個cookie設置流程有三次請求
一共有三次請求
註意:form表單的action走的路徑還是/login/
第一次請求:url:http://127.0.0.1:8080/login get請求 //獲取login頁面,此時不帶cookie
第一次請求:url:http://127.0.0.1:8080/login post請求 user pasw //提交用戶名和密碼,此時不帶cookie,但若認證成功此時在服務端相應會為用戶設置cookie,
第一次請求:url:http://127.0.0.1:8080/index post請求 攜帶著cookie的了
所以在index頁面中就會取到cookie,因為這是的index裏面已經有cookie了
cookie存儲到客戶端
優點:數據存儲在客戶端。減輕服務端的壓力,提高網站的性能
缺點:安全性不高,在客戶端很容易被查看或破解用戶會話信息
session
概念:
Session是服務器端技術,利用這個技術,服務器在運行時可以 為每一個用戶的瀏覽器創建一個其獨享的session對象,由於 session為用戶瀏覽器獨享,所以用戶在訪問服務器的web資源時 ,可以把各自的數據放在各自的session中,當用戶再去訪問該服務器中的其它web資源時,其它web資源再從用戶各自的session中 取出數據為用戶服務。
基本用法
1、設置session值 request.session["session_name"]="admin" 2、獲取session值 session_name = request.session("session_name") 3、刪除session值 del request.session["session_name"] 刪除一組鍵值對 request.session.flush() 刪除一條記錄 4、檢測是否操作session值 if "session_name" is request.session:
# 刪除當前用戶的所有Session數據
5、get(key, default=None) fav_color = request.session.get(‘fav_color‘, ‘red‘) 6、pop(key) fav_color = request.session.pop(‘fav_color‘) 7、keys() 8、items() 9、setdefault() 10 用戶session的隨機字符串 request.session.session_key # 將所有Session失效日期小於當前日期的數據刪除 request.session.clear_expired() # 檢查 用戶session的隨機字符串 在數據庫中是否 request.session.exists("session_key") # 刪除當前用戶的所有Session數據 request.session.delete("session_key") request.session.set_expiry(value) * 如果value是個整數,session會在些秒數後失效。 * 如果value是個datatime或timedelta,session就會在這個時間後失效。 * 如果value是0,用戶關閉瀏覽器session就會失效。 * 如果value是None,session會依賴全局session失效策略。
Session在Django中的配置
Django默認支持Session,並且默認是將Session數據存儲在數據庫中,即:django_session 表中。 a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘ # 引擎(默認) SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認) SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過期(默認) SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改之後才保存(默認)
說白了,流程如下圖,瀏覽器在發起請求時,服務器會在Djano session(字段有session_key,session_data)表格中生成一個鍵值隨機數作為 session_key 的值,並且將驗證後的Post發過來的值存入session_data中,並將隨機數作為cookie值返回給瀏覽器,而下一次瀏覽器只要帶著session_key過來就可以找到對應的數據了
簡單示例代碼
1 def index_session(request): 2 print(">>>", request.session.get("is_login")) 3 print(">>>", request.session.get("username")) 4 is_login = request.session.get("is_login") 5 username = request.session.get("username") 6 if not is_login: 7 return redirect("/login_session") 8 else: 9 return render(request, "index.html") 10 11 12 def login_session(request): 13 14 if request.method == "POST": 15 kepp_str = request.session.get("kepp_str") 16 print("kepp_str--->",kepp_str) 17 if kepp_str.upper() == request.POST.get("validCode").upper(): 18 info = request.POST 19 user_name = info.get("user") 20 password = info.get("pwd") 21 check_user = models.UserInfo.objects.filter(name=user_name, password=password).first() 22 print(check_user) 23 if check_user: 24 request.session["is_login"] = True 25 request.session["username"] = user_name 26 return HttpResponse("200") 27 else: 28 return HttpResponse("201") 29 else: 30 return HttpResponse("202") 31 else: 32 return render(request,"login.html")View Code
Django中cookie&session的實現