
- Django 基本概念
- Django - 首頁
- Django - 基礎
- Django - 概述
- Django - 環境
- Django - 建立專案
- Django - 應用生命週期
- Django - 建立檢視
- Django - URL 對映
- Django - 首頁
- Django - 模板系統
- Django - MVT
- Django - 新增主模板
- Django 管理員
- Django 管理員 - 介面
- Django 管理員 - 建立使用者
- Django 管理員 - 包含模型
- Django 管理員 - 設定顯示欄位
- Django 管理員 - 更新物件
- Django 模型
- Django - 模型
- Django - 插入資料
- Django - 更新資料
- Django - 刪除資料
- Django - 更新模型
- Django 靜態檔案
- Django - 新增靜態檔案
- Django - 新增 CSS 檔案
- Django 高階
- Django - 頁面未找到 (404)
- Django - 頁面重定向
- Django - 傳送郵件
- Django - 通用檢視
- Django - 表單處理
- Django - 檔案上傳
- Django - Apache 設定
- Django - Cookie 處理
- Django - 會話
- Django - 快取
- Django - 評論
- Django - RSS
- Django - AJAX
- Django 有用資源
- Django - 快速指南
- Django - 有用資源
- Django - 討論
Django - 會話
如前所述,我們可以使用客戶端 Cookie 來儲存許多對 Web 應用有用的資料。我們之前已經看到,我們可以使用客戶端 Cookie 來儲存各種對我們的 Web 應用有用的資料。這會導致許多安全漏洞,具體取決於您要儲存的資料的重要性。
出於安全原因,Django 具有用於 Cookie 處理的會話框架。會話用於抽象接收和傳送 Cookie 的過程,資料儲存在伺服器端(例如在資料庫中),客戶端 Cookie 僅包含用於識別的會話 ID。會話也有助於避免使用者瀏覽器設定為“不接受” Cookie 的情況。
設定會話
在 Django 中,啟用會話是在專案的 settings.py 中完成的,方法是在 MIDDLEWARE_CLASSES 和 INSTALLED_APPS 選項中新增一些行。這應該在建立專案時完成,但瞭解這一點總是有益的,因此 MIDDLEWARE_CLASSES 應該包含:
'django.contrib.sessions.middleware.SessionMiddleware'
而 INSTALLED_APPS 應該包含:
'django.contrib.sessions'
預設情況下,Django 將會話資訊儲存在資料庫中(django_session 表或集合),但您可以配置引擎以使用其他方式儲存資訊,例如:在 檔案中或在 快取中。
啟用會話後,每個請求(Django 中任何檢視的第一個引數)都有一個會話(字典)屬性。
讓我們建立一個簡單的示例來了解如何建立和儲存會話。我們之前已經構建了一個簡單的登入系統(請參閱 Django 表單處理章節和 Django Cookie 處理章節)。讓我們將使用者名稱儲存在 Cookie 中,這樣,如果未登出,當訪問我們的登入頁面時,您將看不到登入表單。基本上,讓我們使我們在 Django Cookie 處理中使用的登入系統更安全,方法是在伺服器端儲存 Cookie。
為此,首先讓我們更改登入檢視以在伺服器端儲存我們的使用者名稱 Cookie:
def login(request): username = 'not logged in' if request.method == 'POST': MyLoginForm = LoginForm(request.POST) if MyLoginForm.is_valid(): username = MyLoginForm.cleaned_data['username'] request.session['username'] = username else: MyLoginForm = LoginForm() return render(request, 'loggedin.html', {"username" : username}
然後讓我們為登入表單建立 formView 檢視,如果設定了 Cookie,我們不會在其中顯示錶單:
def formView(request): if request.session.has_key('username'): username = request.session['username'] return render(request, 'loggedin.html', {"username" : username}) else: return render(request, 'login.html', {})
現在讓我們更改 url.py 檔案以更改 URL,使其與我們的新檢視匹配:
from django.conf.urls import patterns, url from django.views.generic import TemplateView urlpatterns = patterns('myapp.views', url(r'^connection/','formView', name = 'loginform'), url(r'^login/', 'login', name = 'login'))
訪問 /myapp/connection 時,您將看到以下頁面:

您將被重定向到以下頁面:

現在,如果您再次嘗試訪問 /myapp/connection,您將直接重定向到第二個螢幕。
讓我們建立一個簡單的登出檢視,用於刪除我們的 Cookie。
def logout(request): try: del request.session['username'] except: pass return HttpResponse("<strong>You are logged out.</strong>")
並將其與 myapp/url.py 中的登出 URL 配對
url(r'^logout/', 'logout', name = 'logout'),
現在,如果您訪問 /myapp/logout,您將看到以下頁面:

如果您再次訪問 /myapp/connection,您將看到登入表單(螢幕 1)。
使用會話可以執行的其他操作
我們已經瞭解瞭如何儲存和訪問會話,但瞭解請求的會話屬性還有一些其他有用的操作也是很好的:
set_expiry (value) - 設定會話的過期時間。
get_expiry_age() - 返回會話過期前剩餘的秒數。
get_expiry_date() - 返回會話過期日期。
clear_expired() - 從會話儲存中刪除已過期的會話。
get_expire_at_browser_close() - 返回 True 或 False,具體取決於使用者關閉 Web 瀏覽器時使用者的會話 Cookie 是否已過期。