Django - 會話



如前所述,我們可以使用客戶端 Cookie 來儲存許多對 Web 應用有用的資料。我們之前已經看到,我們可以使用客戶端 Cookie 來儲存各種對我們的 Web 應用有用的資料。這會導致許多安全漏洞,具體取決於您要儲存的資料的重要性。

出於安全原因,Django 具有用於 Cookie 處理的會話框架。會話用於抽象接收和傳送 Cookie 的過程,資料儲存在伺服器端(例如在資料庫中),客戶端 Cookie 僅包含用於識別的會話 ID。會話也有助於避免使用者瀏覽器設定為“不接受” Cookie 的情況。

設定會話

在 Django 中,啟用會話是在專案的 settings.py 中完成的,方法是在 MIDDLEWARE_CLASSESINSTALLED_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 時,您將看到以下頁面:

Setting Up Sessions

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

Sessions Redirected Page

現在,如果您再次嘗試訪問 /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,您將看到以下頁面:

Logged Out Page

如果您再次訪問 /myapp/connection,您將看到登入表單(螢幕 1)。

使用會話可以執行的其他操作

我們已經瞭解瞭如何儲存和訪問會話,但瞭解請求的會話屬性還有一些其他有用的操作也是很好的:

  • set_expiry (value) - 設定會話的過期時間。

  • get_expiry_age() - 返回會話過期前剩餘的秒數。

  • get_expiry_date() - 返回會話過期日期。

  • clear_expired() - 從會話儲存中刪除已過期的會話。

  • get_expire_at_browser_close() - 返回 True 或 False,具體取決於使用者關閉 Web 瀏覽器時使用者的會話 Cookie 是否已過期。

廣告