Django 使用會話( sessions )功能

題圖:by kacozi from Instagram

淘寶、天貓、京東等電商網站的出現,讓我們足不出戶就能購物。在這些網站中,都有一個“購物車”的功能。當我們在不同商品頁面將商品加入購物車,然后關閉瀏覽器。等下次瀏覽該網站時,我們會依然發現購物車的商品還在。這是怎么實現的了?類似這種場景,一般都是采用 Cookie + Session 方式來實現。

1 Cookie 機制

HTTP 協議是無狀態的。所以服務器無法根據 HTTP 協議來辨別多個 HTTP 請求來自哪個用戶。在實際場景中,服務器經常需要追蹤客戶端的狀態。為了解決這個問題, Cookie 技術應運而生。

cookie 一開始是服務器產生的一段隨機字符串。它的主要內容包括:名字,值,過期時間,路徑與域等信息。然后服務器將其發送給客戶端。在后續的請求中,cookie 會附在請求資源的 HTTP 請求頭上,發送給服務器。

2 Session 機制

如果不涉及用戶登錄等敏感信息時,Cookie 能夠滿足大部分的場景需求。而客戶端(如瀏覽器)會將 Cookie 是保存在硬盤中。如果用戶登錄敏感信息保存到 cookie 中,會存在安全性問題。因為當 HTTP 請求被黑客攔截,然后劫持 cookie 信息。黑客就可以憑借該 cookie 登錄對應的網站。

Session 的出現很好地解決的這個問題。Session 機制是一個服務器端的機制。它會將信息保存服務器端,跟客戶端通信只需要一個隨機的字符串 session_id。如果客戶端沒有禁止 Cookie 功能,session_id 通常是保存在 Cookie中 的。如果 Cookie 被禁用,它則可能通過為 url 加上query string 來添加 session_id。

3 在 Django 中的應用

Django 為我們提供了一個通用的 Session 框架。使用 Django 2.X 版本創建新項目的時,Django 默認會幫我們啟用該功能。

Django 默認 Session 數據保存到數據庫中,可以在 settings.py 中看到配置信息項目。

INSTALLED_APPS = [
    # 啟用 sessions 應用
    'django.contrib.sessions',
]

MIDDLEWARE = [
    # 啟用 Session 中間層
    'django.contrib.sessions.middleware.SessionMiddleware',
]

然后我們在將自帶組件的模型同步到數據庫中。如果你還不熟悉這塊內容,可以閱讀《Django 學習筆記之模型(上)》這篇文章。我們之后會看到數據庫中有個 django_session 表:

點擊查看大圖

除了上述的基于數據庫的會話,Django 還提供另外三種方法:
1)保存到緩存中
如果你的場景需要快速存儲會話,可以選擇該方案。使用之前,需要配置下 Django 的緩存框架。在 settings.py 中增加 SESSION_ENGINE 配置。

這其中也是有兩種保存數據的方案,具體配置如下:

  • 方案一
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'

這種配置方案 Django 只是簡單保存會話。同時,這種方案持久性不好。因為當緩存數據存滿時將清除部分數據,或者遇到緩存服務器重啟時數據將丟失。

  • 方案二
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db'

這種方案既保證快速存儲會話數據,又保證數據持久性。因為該使用方案, Session 在保存到緩存的同時還會被保存到數據庫中,當 Django 在緩存中找不到Session 時,會從數據庫中找到。因此,這種方案的性能開銷會比方案一大。

如果我們在工程中同時配置了數據庫會話和緩存會話,Django 默認優秀選擇緩存會話。

2)保存到文件中
這種方案是保存數據到本地磁盤中。因為磁盤的 I/O 瓶頸問題,導致這種方案存儲數據效率不是很高。如果要使用這種方案,在 settings.py 中增加 SESSION_ENGINE 配置。具體配置如下:

SESSION_ENGINE = 'django.contrib.sessions.backends.file'
# 可選配置
SESSION_FILE_PATH = '/monkey/www/'

SESSION_FILE_PATH 默認使用 tempfile.gettempdir() 方法的返回值,就像 /tmp目錄。如果你想更新文件的保存路徑,可以手動指定。另外需確保你的文件存儲目錄,以及 Web 服務器對該目錄具有讀寫權限。

3)保存到 cookie 中
這種方案將數據保存到 cookie 中。這種方案適用于對數據保密性不嚴格的場景。如果要使用這種方案,在 settings.py 中增加 SESSION_ENGINE 配置。具體配置如下:

SESSION_ENGINE = 'jango.contrib.sessions.backends.signed_cookies'
# 建議配置,阻止 javascript 對會話數據的訪問,提高安全性。
SESSION_COOKIE_HTTPONLY= True

往前 Django 學習筆記文章
Django 學習筆記之環境搭建
Django 學習筆記之初始
Django 學習筆記之視圖與URL配置
Django 學習筆記之模板
Django 學習筆記之模型(上)
Django 學習筆記之模型(下)
Django 學習筆記之后臺管理
Django 學習筆記之模型表單
Django 學習筆記之使用舊數據庫
Django 實戰1:搭建屬于自己社工查詢系統(上)
Django 實戰1:搭建屬于自己社工查詢系統(下)
Django 學習筆記之模型高級用法(上)
Django 學習筆記之模型高級用法(下)
Django 實現分頁功能


本文原創發布于微信公眾號「極客猴」,歡迎關注第一時間獲取更多原創分享

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容

  • 版權: https://github.com/haiiiiiyun/awesome-django-cn Aweso...
    若與閱讀 23,169評論 3 241
  • 會話(Session)跟蹤是Web程序中常用的技術,用來跟蹤用戶的整個會話。常用的會話跟蹤技術是Cookie與Se...
    chinariver閱讀 5,651評論 1 49
  • 限行,這時髦玩意我算是趕上了!擔心帶給自己不便的同時,也有點改變慣常的小小激動,說小驚喜也不為過。不管怎么樣,...
    簡亦子閱讀 323評論 1 0
  • 今天我看了的≤小屁孩日記≥這部電影。這部電影講的是,一個小男孩,他叫格雷格,是一位美國人。這個故事就發生在他的中...
    朱朱恒閱讀 594評論 2 1
  • 雖然沒有月亮, 夜晚也發著光, 不是燈籠霓虹相輝, 也非燭火觥籌交錯, 只因你身旁,我明亮。
    洛鈞寒閱讀 319評論 0 1