一、cookie和session的介紹
cookie不屬於http協議范圍,由於http協議無法保持狀態,但實際情況,我們卻又需要“保持狀態”,因此cookie就是在這樣一個場景下誕生。
cookie的工作原理是:由服務器產生內容,瀏覽器收到請求后保存在本地;當瀏覽器再次訪問時,瀏覽器會自動帶上cookie,這樣服務器就能通過cookie的內容來判斷這個是“誰”了。
cookie雖然在一定程度上解決了“保持狀態”的需求,但是由於cookie本身最大支持4096字節,以及cookie本身保存在客戶端,可能被攔截或竊取,因此就需要有一種新的東西,它能支持更多的字節,並且他保存在服務器,有較高的安全性。這就是session。
問題來了,基於http協議的無狀態特征,服務器根本就不知道訪問者是“誰”。那么上述的cookie就起到橋接的作用。
我們可以給每個客戶端的cookie分配一個唯一的id,這樣用戶在訪問時,通過cookie,服務器就知道來的人是“誰”。然后我們再根據不同的cookie的id,在服務器上保存一段時間的私密資料,如“賬號密碼”等等。
總結而言:cookie彌補了http無狀態的不足,讓服務器知道來的人是“誰”;但是cookie以文本的形式保存在本地,自身安全性較差;所以我們就通過cookie識別不同的用戶,對應的在session里保存私密的信息以及超過4096字節的文本。
另外,上述所說的cookie和session其實是共通性的東西,不限於語言和框架
二、登錄應用原理
前幾節的介紹中我們已經有能力制作一個登陸頁面,在驗證了用戶名和密碼的正確性后跳轉到后台的頁面。但是測試后也發現,如果繞過登陸頁面。直接輸入后台的url地址也可以直接訪問的。這個顯然是不合理的。其實我們缺失的就是cookie和session配合的驗證。有了這個驗證過程,我們就可以實現和其他網站一樣必須登錄才能進入后台頁面了。
先說一下這種認證的機制。每當我們使用一款瀏覽器訪問一個登陸頁面的時候,一旦我們通過了認證。服務器端就會發送一組隨機唯一的字符串(假設是123abc)到瀏覽器端,這個被存儲在瀏覽端的東西就叫cookie。而服務器端也會自己存儲一下用戶當前的狀態,比如login=true,username=hahaha之類的用戶信息。但是這種存儲是以字典形式存儲的,字典的唯一key就是剛才發給用戶的唯一的cookie值。那么如果在服務器端查看session信息的話,理論上就會看到如下樣子的字典
{'123abc':{'login':true,'username:hahaha'}}
因為每個cookie都是唯一的,所以我們在電腦上換個瀏覽器再登陸同一個網站也需要再次驗證。那么為什么說我們只是理論上看到這樣子的字典呢?因為處於安全性的考慮,其實對於上面那個大字典不光key值123abc是被加密的,value值{'login':true,'username:hahaha'}在服務器端也是一樣被加密的。所以我們服務器上就算打開session信息看到的也是類似與以下樣子的東西
{'123abc':dasdasdasd1231231da1231231}
三、cookie的簡單使用
1、獲取Cookie
request.COOKIES.get("islogin",None) #如果有就獲取,沒有就默認為none
2、設置Cookie
obj = redirect("/index/")
obj.set_cookie("islogin",True) #設置cookie值,注意這里的參數,一個是鍵,一個是值
obj.set_cookie("haiyan","344",20) #20代表過期時間
obj.set_cookie("username", username)
3、刪除Cookie
obj.delete_cookie("cookie_key",path="/",domain=name)
登錄認證示例:
需要知道幾點
一共有三次請求
注意:form表單的action走的路徑還是/login/
第一次請求:url:http://127.0.0.1:8080/login get請求
第一次請求:url:http://127.0.0.1:8080/login post請求 user pasw
第一次請求:url:http://127.0.0.1:8080/index post請求 攜帶着cookie的了
所以在index頁面中就會取到cookie,因為這是的index里面已經有cookie了
urls.py

views.py

models.py

login.html

index.html

cookie存儲到客戶端
優點:數據存儲在客戶端。減輕服務端的壓力,提高網站的性能
缺點:安全性不高,在客戶端很容易被查看或破解用戶會話信息
四、session的簡單使用
1、基本操作(需要掌握的)
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:
其他操作
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、flush() 刪除當前的會話數據並刪除會話的Cookie。
這用於確保前面的會話數據不可以再次被用戶的瀏覽器訪問
例如,django.contrib.auth.logout() 函數中就會調用它。
11 用戶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失效策略。
2、流程解析圖
由於cookie會把所有的信息都保存在客戶端,也就是瀏覽器上,這樣會導致不安全,所以引用了session,但是只是單單的session也不好用,必須session和cookie配合這去用。
session會把信息保存在服務端。
session原理分析流程:
{"sessionID":"dfhasdjfhkjlcn4352kjdsfhkjsd"}
if post:
request.session["is_login"]=True
request.session["user"]=username
return redirect("/index/”)
Django會做三件事:
1、創建隨機字符串。假如s="sdgsdfg4565dfgsdfgsdf"
2、 在django-session表中,添加一條記錄
django-session有三個字段,分別是:session_key,session_data,expire_data
SQL: 語句: insert into django-session values (s,"{"IS_LOGON":True,"USER":egon}",12321)
3、給瀏覽器設置sessionID: obj.set_cookie("sessionID",s)
執行完之后重定向:
/home/ ----> {"sessionID":"fasdlkfjsakdl324ada2adhdjlka99"}
request.session.get("IS_LOGON",None)
在django-session表中,進行查詢:
s=requset.COOKIE.get("sessionID")
select session-data from django-session where session-key=s
3、示例
views.py

template

4、session存儲的相關配置
(1)默認的是數據庫配置:

(2)緩存配置

(3)文件配置
