在現代 Web 應用程式中,跨多個請求維護使用者狀態對於建立個人化體驗至關重要。 Django 透過其內建的會話框架簡化了這個過程,使開發人員能夠安全有效地管理使用者資料。
Django 中的內建會話負責管理多個請求上的使用者資料。當使用者登入 Django 應用程式時,伺服器會建立會話 ID,通常儲存在用戶端瀏覽器上的 cookie 中。此會話 ID 用作檢索伺服器上儲存的資料並將請求連結到特定使用者的金鑰。這就是為什麼身份驗證狀態將在不同頁面上持續存在的原因。
Django 的會話中間件可以自動化會話管理。它處理傳入請求以檢索會話資料並準備傳出回應以更新或設定會話 cookie。若要檢查會話中間件是否已啟用,請查看 MIDDLEWARE 部分下的 settings.py 檔案:
# settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # Other middleware ]
我們有多種保存會話資料的選項。根據您想要建立的應用程序,每個應用程式都有優點和缺點。
類比:想像劇場有一個安全的儲藏室,裡面有置物櫃,所有外套都存放在那裡。每個儲物櫃都分配有一個與您門票上的號碼相符的唯一號碼。當你拿著票回來時,服務員會在日誌中找到儲物櫃號碼並取回你的外套。
資料庫支援的會話將會話資料保存在資料庫伺服器上。因此,用戶首選項、登入狀態和購物車詳細資訊等敏感資訊仍安全地保存在後端。這種類型的會話可能更安全,但在涉及寫入和讀取過程時會造成一些不便。與快取支援的會話相比,資料庫支援的會話速度較慢,因此,如果您正在建立流量較高的應用程序,那麼您應該再考慮一下。在資料庫中儲存會話會增加資料庫的負載,如果管理不當,會影響整體效能。
如果你想使用資料庫支援的會話,你需要將 django.contrib.sessions 加入到你的 INSTALLED_APPS 設定中。請確保執行manage.py migrate來安裝儲存會話資料的單一資料庫表。
類比:在這種情況下,每件外套都存放在劇院後面一個大房間裡不同的、貼有標籤的儲物櫃中。每個儲物櫃都有一個獨特的標籤或文件,其中包含外套詳細信息,當您出示門票時,服務員會前往更衣室,找到相應的標籤,並取回您的外套。
基於檔案的會話使用伺服器的檔案系統來保存會話資料。這意味著每個使用者會話都儲存在伺服器上的單獨檔案中。預設情況下,Django 將會話檔案儲存在 /tmp 下的 django_session 目錄中(在基於 Unix 的系統上)或 Django 設定中指定的目錄中。
若要啟用基於檔案的會話,請在 settings.py 檔案中將 SESSION_ENGINE 設定為 django.contrib.sessions.backends.file。
# settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # Other middleware ]
類比:這裡,劇場在入口處使用了一個臨時衣帽架,只存放短暫的外套。這使得取外套變得非常快,但如果架子已滿,最舊的外套可能會移至二級存儲或完全移除。
這種類型的會話儲存是快取系統(例如 Memcached 或 Redis)儲存會話資料的地方。將會話保存在記憶體快取中將有助於高流量或需要快速響應時間的應用程序,因為寫入或讀取過程非常快。
若要使用快取支援的會話,請在 settings.py 檔案中設定 SESSION_ENGINE 設定。您還必須根據您使用的快取記憶體配置快取。
# settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # Use file-based session storage SESSION_FILE_PATH = '/path/to/session/files/' # Specify a directory for session files (optional)
或者,您可以使用 django.contrib.sessions.backends.cached_db ,它將會話資料儲存在快取和資料庫中,如果快取不可用,則回退到資料庫。
使用此類會話的最佳優勢是可擴展性和速度。快取支援的會話不僅速度快,因為將資料保存在記憶體中,而且還減少了資料庫會話的負載。數據可以跨伺服器共享,從而使多伺服器設定成為可能。
類比:在這裡,劇院允許你隨身攜帶外套,而不是把你的外套存放起來,但要求你在門票上蓋上特殊的印章,以證明這是你的外套。你隨身攜帶外套(場次數據),每次進入劇院時,服務員都會檢查門票上的印章,以確保它沒有被篡改。
Django 中的簽章 cookie 會話將會話資料直接儲存在用戶端瀏覽器上的簽章和加密 cookie 中,而不是儲存在伺服器端(資料庫或快取)。
若要啟用簽章 cookie 會話,請在 Django 的 settings.py 檔案中設定 SESSION_ENGINE 以使用簽章 cookie 後端:
# settings.py MIDDLEWARE = [ 'django.middleware.security.SecurityMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', # Other middleware ]
簽署 Cookie 會話,這可以減少伺服器負載並釋放伺服器資源。但是,由於 Cookie 的大小限制(約 4 KB),簽署 Cookie 會話不適合儲存大量會話資料。較大的 cookie 大小可能會導致請求速度變慢,因為 cookie 資料會隨每個請求一起傳送。
Django 提供了多種設定來設定會話行為:
SESSION_COOKIE_AGE:設定會話過期時間(以秒為單位)。
SESSION_COOKIE_SECURE:需要透過 HTTPS 傳送會話。
SESSION_EXPIRE_AT_BROWSER_CLOSE:瀏覽器關閉時結束會話。
SESSION_COOKIE_HTTPONLY:限制 JavaScript 對會話 cookie 的訪問,增強安全性。
這些設定有助於根據特定應用程式需求自訂會話行為。有關會話配置的更多信息,請閱讀 Django 文件。
要與 Django 視圖中的會話進行交互,請使用 request.session 對象,其行為類似於字典。以下是一些基本操作:
儲存資料:
# settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # Use file-based session storage SESSION_FILE_PATH = '/path/to/session/files/' # Specify a directory for session files (optional)
擷取資料:
# settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # For caching session storage SESSION_CACHE_ALIAS = 'default' # Specify the cache alias if needed (e.g., 'redis' or 'memcached') # Cache configuration (example with Redis) CACHES = { 'default': { 'BACKEND': 'django_redis.cache.RedisCache', 'LOCATION': 'redis://127.0.0.1:6379/1', # Redis URL 'OPTIONS': { 'CLIENT_CLASS': 'django_redis.client.DefaultClient', } } }
刪除資料:
# settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' SECRET_KEY = 'your-secret-key' # Make sure this key is kept secure and unique for your app
會話的常見用途是追蹤使用者登入狀態。以下是如何使用會話實現簡單的登入系統:
request.session['username'] = 'Harry Potter'
Django視圖中session的方法還是有很多的。如需完整列表,請查看 Django 文件。
Django 定期刪除過期的會話。您可以透過設定會話清理程序或執行 django-admin clearsessions 等管理指令來自訂頻率。
避免在會話中儲存大量數據,因為這可能會增加伺服器負載並減慢回應時間。最後啟用安全性 cookie、HttpOnly 和 HTTPS 設定來保護會話資料。
Django 的會話框架功能強大、靈活且安全,讓您可以輕鬆地在 Web 應用程式中實現會話管理。透過正確的配置和安全實踐,您可以利用 Django 會話創建高效、個人化的使用者體驗,同時保持強大的安全性。
以上是Django 中的身份驗證和授權:Django 會話的詳細內容。更多資訊請關注PHP中文網其他相關文章!