1. 程式人生 > >Django基礎之Session

Django基礎之Session

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