1. 程式人生 > >淺析Django之session與cookie

淺析Django之session與cookie

expires name 但是 服務器壓力 第一次 backend setting 數據 max

淺析Django之session與cookie

1 session與cookie概述

原理:
    由於HTTP協議是無狀態,無連接的,當用戶發起網路請求時,需要服務端能標識用戶ID,用以存儲用戶相關信息,因此服務器創建一個session空間用於標識用戶/跟蹤用戶,session數據表中存儲了session_key用於標識用戶id,session_data用於存儲用戶的信息.
    但是服務端是怎樣識別特定的用戶id呢??此時就需要在客戶端創建cookie,每次HTTP請求的時候,客戶端都會發送相應的Cookie信息到服務端,其中包含服務端讓客戶端設置的 sessionid:session_key,兩者連接的橋梁是session_key,因此session是基於cookie實現的.
    
實現過程:
    瀏覽器第一次訪問,服務器會創建一個session對象並返回session_key = ‘ID(標識身份)‘,告訴服務端創建cookie對象並set_cookie(‘sessionid‘,‘ID標識身份‘),cookie中就顯示出鍵值對key:value  sessionid:‘ID‘
    後續訪問服務器,發起請求會攜帶cookie信息中sessionid = ‘ID‘,與服務器中的session_key進行標識, 如果不存在,服務器會重新創建一個新的session數據,並返回session_key給瀏覽器設置cookie信息.

2 session與cookie的區別

區別主要是以下幾點:

1 Cookie有大小限制以及瀏覽器在存cookie的個數也有限制,Session是沒有大小限制和服務器的內存大小有關
2 Cookie有安全隱患,通過攔截或本地文件找得到你的cookie後可以進行攻擊,但是提高網站性能,減輕服務器壓力
3 Session是保存在服務器端上會存在一段時間才會消失,這個過期時間可以設置,session過多會增加服務器的壓力
4 Session是在服務端保存的一個數據結構,用來跟蹤用戶的狀態,這個數據可以保存在集群、數據庫、文件中
  Cookie是客戶端保存用戶信息的一種機制,用來記錄用戶的一些信息,session是基於cookie實現

3 session常見的用法

session在中間件時就開始啟用,啟用後每個HttpResponse對象都有一個session數據
session = {
  字符串1:{用戶信息1}
  字符串2:{用戶信息2}
}

1 設置session
request.session[‘K1‘] = 122

2 獲取session
request.session[‘K1‘]  #獲取K1對應的信息,不存在就報錯
request.session.get[‘K1‘]   #等同上面,防止設置默認情況get(key,default=‘‘)

3 刪除session
del request.session[‘K1‘]  刪除
request.session.clear()    刪除
request.session.flush()   刪除當前的會話,並刪除當前會話的cookie,其中logout中就封裝了flush

4 設置過期時間
request.session[‘name‘]=username   在數據庫中session表中數據不刪除,只是過期
request.session.set_expiry(10)     設置10s後清空session

4 session存儲位置

5 session存儲位置
(1)數據庫 :默認存在數據庫中
    settings.py配置  SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘ 默認
(2)緩存 :只存儲在本地內存
    SESSION_ENGINE = ‘django.contrib.sessions.backends.cache‘(引擎)
    SESSION_CACHE_ALIAS= ‘default‘  使用的緩存別名(默認內存緩存,也可以是memcache),
                                  此處別名依賴緩存的設置
(3)數據庫和緩存: 優先從本地緩存中讀取數據
    SESSION_ENGINE=‘django.contrib.sessions.backends.cached_db‘(引擎)
(4)文件
    SESSION_ENGINE = ‘django.contrib.sessions.backends.file‘ (引擎)
    SESSION_FILE_PATH=None  緩存文件路徑,如果為None,則使用tempfile模塊
                          獲取一個臨時地址tempfile.gettempdir()   
(5)加密cookie

5 cookie常見的用法

1 設置cookie
obj.set_cookie("name","zhanggen",expires=value,path=‘/‘ )

2 獲取cookie
value = request.COOKIES["cookie_key"]   #獲取value值
cookie = requset.COOKIE   #cookie對象

3 添加cookie
response.addCookie(cookie)

4 刪除cookie
response.delete_cookie("cookie_key",path="/",domain=name)

5 判斷cookie
if "cookie_name" is request.COOKIES :

6 參數缺省值描述:
max_age   cookies的持續有效時間(以秒計)
expires   cookies的過期時間
path      cookie生效的路徑前綴,瀏覽器只會把cookie回傳給帶有該路徑的頁面
domain    cookie生效的站點 你可用這個參數來構造一個跨站cookie 
secure    False  如果設置為 True 瀏覽器將通過HTTPS來回傳cookie

淺析Django之session與cookie