Django基礎之Session
阿新 • • 發佈:2018-11-21
1. Session的由來
Cookie雖然在一定程度上解決了“保持狀態”的需求,但是由於Cookie本身最大支援4096位元組,以及Cookie本身儲存在客戶端,可能被攔截或竊取,因此就需要有一種新的東西,它能支援更多的位元組,並且它儲存在伺服器,有較高的安全性。這就是Session。
問題來了,基於HTTP協議的無狀態特徵,伺服器根本就不知道訪問者是“誰”,那麼上述的Cookie就起到橋接的作用。
我們可以給每個客戶端的Cookie分配一個唯一的id,這樣使用者在訪問時,通過Cookie,伺服器就知道來的人是“誰”。然後我們再根據不同的Cookie的id,在伺服器上儲存一段時間的私密資料,如“賬號,密碼等”。
總而言之:Cookie彌補了HTTP無狀態的不足,讓伺服器知道來的人是“誰”,但是Cookie以文字的形式儲存在本地,自身安全性較差;所以我們就通過Cookie識別不同的使用者,對應的在Session裡儲存私密的資訊,以及超過4095位元組的文字。
另外,上述所說的Cookie和Session其實是共通的東西,不限於語言和框架。
2. Django中Session相關方法
2.1 獲取、設定、刪除Session中資料
# 獲取session值 request.session["k1"] # 獲取session值 request.session.get("k1", None) # 設定Session request.session["k1"] = 123 # 為session設定預設值 request.session.setdefault("k1", 123) # 刪除Session中的資料 del request.session["k1"]
2.2 所有鍵,值,鍵值對
# session中的所有鍵 request.session.keys() # session中的所有值 request.session.values() # session中的所有鍵值對 request.session.items() # session中的可迭代的鍵 request.session.iterkeys() # session中的可迭代的值 request.session.itervalues() # session中的可迭代鍵值對 request.session.iteritems()
2.3 會話session的key
request.session.session_key
2.4 將所有session失效日期小於當前日期的資料刪除
request.session.clear_expired()
2.5 檢查會話session的key在資料庫中是否存在
request.session.exists("session_key")
2.6 刪除當前會話的所有session資料
request.session.delete()
2.7 刪除當前的會話資料並刪除會話的Cookie
request.session.flush()
這用於確保前面的會話資料不可以再次被使用者的瀏覽器訪問。
例如:django.contrib.auth.logout()函式中就會呼叫它。
2.8 設定會話Session和Cookie的超時時間
request.session.set_expiry(value)
- 如果value是個整數,session會在value秒後失效。
- 如果value是個datetime或timedelta,session就會在這個時間後失效。
- 如果value是0,使用者關閉瀏覽器session就會失效
- 如果value是None,session會依賴全域性session失效策略
3. Session流程解析
4. Django中的Session配置
Django中預設支援Sessin,其內部提供了5種類型的Session供開發者使用。
4.1 資料庫Session
# 引擎(預設) SESSION_ENGINE = "django.contrib.sessions.backends.db"
4.2 快取Session
# 引擎 SESSION_ENGINE = "django.contrib.sessions.backends.cache" # 使用的快取別名(預設記憶體快取,也可以是memcache),此處別名依賴快取的設定 SESSION_CACHE_ALLAS = "default"
4.3 檔案Session
# 引擎 SESSION_ENGINE = "django.contrib.sessions.backends.file" # 快取引擎路徑,如果為None,則使用tempfile模組獲取一個臨時地址tempfile.gettempdir() SESSION_FILE_PATH = None
4.4 快取+資料庫
# 引擎 SESSION_ENGINE = "django.contrib.sessions.backends.cached_db"
4.5 加密Cookie Session
# 引擎 SESSION_ENGINE = "django.contrib.sessions.backends.signed_cookies"
4.6 其他公用設定項
# session的cookie儲存在瀏覽器上時的key, 即sessionid = 隨機字串(預設) SESSION_COOKIE_NAME = "sessionid" # session的cookie儲存的路徑(預設) SESSION_COOKIE_PATH = "/" # session的cookie儲存的域名(預設) SESSION_COOKIE_DOMAIN = None # 是否Https傳輸 SESSION_COOKIE_SECURE = True # 是否session的cookie只支援http傳輸(預設) SESSION_COOKIE_HTTPONLY = True # session的cookie失效日期(2周)(預設) SESSION_COOKIE_AGE = 1209600 # 是否關閉瀏覽器是的Session過期(預設) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否每次請求都儲存session,預設修改之後才儲存(預設) SESSION_SAVE_EVERY_REQUEST = False