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,將能看到如下頁面−
Django

你會被重定向到下面的頁面 -
Django

現在,如果您嘗試再次訪問/myapp/connection,它會直接重定向到第二個屏幕。

讓我們創建一個簡單的註銷視圖,用於清除Cookie。

def logout(request):
try:
del request.session['username']
except:
pass
return HttpResponse("You are logged out.")

並在 myapp/url.py 中配對 URL 註銷

url(r'^logout/', 'logout', name = 'logout'),

現在,如果訪問/myapp/logout,將得到如下頁面-
Django

如果再次訪問 /myapp/connection ,將會得到的登錄表單(屏幕1)。

可能使用會話的一些動作

我們已經看到如何存儲和訪問會話,下面是一個很好的瞭解請求的會話屬性還有其他一些有用的操作,如 -

  • set_expiry (**value**) − 設置會話的過期時間

  • get_expiry_age() − 返回直到會話過期的秒數

  • get_expiry_date() − 返回本會話將到期的日期

  • clear_expired() − 從會話中刪除過期的會話存儲

  • get_expire_at_browser_close() − 返回true或false,具體取決於用戶的會話cookie是否已過期在用戶的Web瀏覽器關閉時