Django Session對談


如前所述,我們可以在Web應用程式用戶端使用Cookie來儲存大量的有用資料。 我們在此之前已經看到了可以使用用戶端的cookie儲存各種資料,在Web應用程式這是非常有用的。這就導致了很多要儲存資料的重要性和一些安全漏洞問題。

出於安全原因,Django有一個對談框架來處理Cookies。 對談用於抽象的接收和傳送cookie,資料儲存在伺服器端(如資料庫),而用戶端的cookie只是有識別對談ID。對談也有助於避免在使用者瀏覽器設定為「不接受」cookies行為。

設定對談

在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的Cookies處理一章)。讓我們儲存使用者名在cookie。因此如果不登出,存取我們的登入頁面時,你不會看到登入表單。 在Django通過儲存Cookie在伺服器端,使用cookies處理更加安全。

對於這一點,首先讓我們改變登入程式碼以儲存username 在伺服器端-
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}
那麼讓我們來建立檢視對應登入表單的檢視,如果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,具體取決於使用者的對談cookie是否已過期在使用者的Web瀏覽器關閉時