如前所述,我們可以在Web應(yīng)用程序客戶端使用Cookie來存儲大量的有用數(shù)據(jù)。 我們在此之前已經(jīng)看到了可以使用客戶端的cookie存儲各種數(shù)據(jù),在Web應(yīng)用程序這是非常有用的。這就導(dǎo)致了很多要保存數(shù)據(jù)的重要性和一些安全漏洞問題。
出于安全原因,Django有一個會話框架來處理Cookies。 會話用于抽象的接收和發(fā)送cookie,數(shù)據(jù)保存在服務(wù)器端(如數(shù)據(jù)庫),而客戶端的cookie只是有識別會話ID。會話也有助于避免在用戶瀏覽器設(shè)置為“不接受”cookies行為。
在Django中,使會話在項目 settings.py 完成,通過添加一些行到MIDDLEWARE_CLASSES和INSTALLED_APPS選項。這應(yīng)該在創(chuàng)建項目完成,但它總是很容易知道,所以MIDDLEWARE_CLASSES應(yīng)該類似如下 ?
# Filename : example.py # Copyright : 2020 By Nhooo # Author by : www.soo66.com # Date : 2020-08-08 'django.contrib.sessions.middleware.SessionMiddleware'
INSTALLED_APPS應(yīng)該有 -
# Filename : example.py # Copyright : 2020 By Nhooo # Author by : www.soo66.com # Date : 2020-08-08 'django.contrib.sessions'
默認(rèn)情況下,Django在數(shù)據(jù)庫保存會話信息(表django_session中或集合),但可以用其他的方式類似配置的引擎存儲的信息:在文件中或在緩存中。
當(dāng)會話啟用,每個請求(在Django任何針對第一個參數(shù))有一個會話(字典)屬性。
讓我們創(chuàng)建一個簡單的示例,看看如何創(chuàng)建和保存會話。我們之前已經(jīng)建立了一個簡單的登錄系統(tǒng)(見Django的表單處理的章節(jié)和Django的Cookies處理一章)。讓我們保存用戶名在cookie。因此如果不注銷,訪問我們的登錄頁面時,你不會看到登錄表單。 在Django通過保存Cookie在服務(wù)器端,使用cookies處理更加安全。
對于這一點,首先讓我們改變登錄代碼以保存username 在服務(wù)器端-
# Filename : example.py # Copyright : 2020 By Nhooo # Author by : www.soo66.com # Date : 2020-08-08 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}
那么讓我們來創(chuàng)建視圖對應(yīng)登錄表單的視圖,如果cookie設(shè)置將不會顯示表單 -
# Filename : example.py # Copyright : 2020 By Nhooo # Author by : www.soo66.com # Date : 2020-08-08 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', {})
現(xiàn)在,讓我們修改url.py文件并更改URL,因此配對新視圖 ?
# Filename : example.py # Copyright : 2020 By Nhooo # Author by : www.soo66.com # Date : 2020-08-08 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'))
當(dāng)訪問 /myapp/connection,將能看到如下頁面?
你會被重定向到下面的頁面 -
現(xiàn)在,如果您嘗試再次訪問/myapp/connection,它會直接重定向到第二個屏幕。
讓我們創(chuàng)建一個簡單的注銷視圖,用于清除Cookie。
# Filename : example.py # Copyright : 2020 By Nhooo # Author by : www.soo66.com # Date : 2020-08-08 def logout(request): try: del request.session['username'] except: pass return HttpResponse("<strong>You are logged out.</strong>")
并在 myapp/url.py 中配對 URL 注銷
# Filename : example.py # Copyright : 2020 By Nhooo # Author by : www.soo66.com # Date : 2020-08-08 url(r'^logout/', 'logout', name = 'logout'),
現(xiàn)在,如果訪問/myapp/logout,將得到如下頁面-
如果再次訪問 /myapp/connection ,將會得到的登錄表單(屏幕1)。
我們已經(jīng)看到如何存儲和訪問會話,下面是一個很好的了解請求的會話屬性還有其他一些有用的操作,如:
set_expiry ( value ) ? 設(shè)置會話的過期時間
get_expiry_age() ? 返回直到會話過期的秒數(shù)
get_expiry_date() ? 返回本會話將到期的日期
clear_expired() ? 從會話中刪除過期的會話存儲
get_expire_at_browser_close() ? 返回true或false,具體取決于用戶的會話cookie是否已過期在用戶的Web瀏覽器關(guān)閉時