Python框架----cookie和session


一、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

 View Code

views.py

 View Code

models.py

 View Code

login.html

 View Code

index.html

 View Code

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

 View Code

template

 View Code

4、session存儲的相關配置

 (1)默認的是數據庫配置:        

 View Code

(2)緩存配置

 View Code

(3)文件配置

 View Code

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM