django會話javascript
django提供對匿名會話全方位的支持,會話框架能夠存儲和檢索每一個站點訪問者的任意數據。會話數據是存儲在服務器端的,而且簡要了發送和接受cookie的過程,cookies只包含一個session ID而不是數據自己,除非你是使用了基於cookie備份的會話。html
下面咱們來看看該如何使用會話框架吧java
會話是經過一箇中間件實現的。因此要想啓用會話功能,只須要在MIDDLEWARE_CLASSES 加入django.contrib.sessions.middleware.SessionMiddleware就ok了python
若是使用django-admin.py startproject建立的項目默認是啓用了這個功能的,因此,若是你不想使用sessions功能的話,記得在MIDDLEWARE_CLASS中移除對應的項,數據庫
而且,記得在installed_apps裏面移除sessions,這會爲你節省一點點數據庫空間django
默認django會在你的數據庫中存儲會話(使用django.contrib.sessions.models.Session模型)後端
儘管這很方便,但有些時候把會話存儲在其餘地方會使訪問的更快,下面咱們來看一下各類配置會話引擎的方法吧瀏覽器
默認使用的方法,須要把django.contrib.sessions添加到INSTALLED_APPS設置裏面緩存
而後運行manage.py syncdb在數據庫中生成對應的表服務器
若是想要的你的系統表現的更好,你能夠考慮使用基於緩存的後端處理,不過要是緩存的話,你首先要配置你的緩存
一旦配置好緩存,你有兩個如何在緩存中存儲數據的選擇
這兩種選擇都很快,第一種cache相比cached_db更快由於沒有數據庫交互;但在通常狀況下,cached_db已經夠快的了,若是須要更快,能夠考慮cache
注意,cached_db也是要用到數據庫的,記得參考上面的 使用數據庫支持的會話
要使用基於文件的會話,記得把SESSION_ENGIN設爲django.contrib.sessions.backends.file,另外你可能還要設置SESSION_FILE_PATH去控制django存儲會話的地方,前提記得確認django服務器有權限讀寫那個位置
要使用基於cookie的會話,只須要把SESSION_ENGIN設置爲django.contrib.sessions.backends.signed_cookies,那些會話數據會使用django的加密簽名工具和SECRET_KEY去存儲數據
提示:建議把SESSION_COOKIE_HTTPONLY=True,這樣能夠防止訪問到javascript存儲的數據
提醒:
一旦會話中間件被啓用,每個HttpRequest對象-每個django視圖函數的第一個參數-將有一個session屬性,這是一個相似字典的對象,你能夠在你的視圖函數裏面的任何地方使用request.session,可使用屢次
下面的僞代碼展現了session的標準字典方法
class backends.base.SessionBase #這是全部會話對象的基類,下面是一些標準的字典方法 __getitem__(key) #Example: fav_color = request.session['fav_color'] __setitem__(key, value) #Example: request.session['fav_color'] = 'blue' __delitem__(key) #Example: del request.session['fav_color']. 若是key不存在,和標準的字典同樣,將拋出一個keyError的錯誤 __contains__(key) #Example: 'fav_color' in request.session,返回一個bool值 get(key, default=None) #Example: fav_color = request.session.get('fav_color', 'red'),若是get不到名爲fav_color的session,fav_color=red pop(key) #Example: fav_color = request.session.pop('fav_color') #經常使用的字典方法 keys() items() setdefault() clear() #還有如下這些方法 flush() #從會話中刪除已經發送給用戶的cookie(會話)的值,並從新生成該會話的key,這樣能夠確保以前的會話數據不會被再次訪問到,好比django.contrib.auth.logout() 這個函數會調用這個方法。 set_test_cookie() #設置一個測試的cookie,與下面的test_cookie_worked協同 test_cookie_worked() #先要調用set_test_cookie(),返回一個bool變量 delete_test_cookie() #刪除測試的cookie set_expiry(value) #設置會話的過時時間 #若是value是整數,則是表明秒數,調用request.session.set_expiry(300) #若是是datetime或者timedelta對象,則是對應的時間日期 #若是是None,則使用全局到期政策 get_expiry_age() #返回會話過時剩餘的秒數 get_expiry_date() #返回會話過時的日期 get_expire_at_browser_close() #返回當瀏覽器關閉的時候cookie時候被刪除,是一個bool變量cookie will expire when the user’s Web browser is closed.
session對象指南
簡單使用:設置並使用session
def post_comment(request, new_comment): if request.session.get('has_commented', False): return HttpResponse("You've already commented.") c = comments.Comment(comment=new_comment) c.save() request.session['has_commented'] = True return HttpResponse('Thanks for your comment!')
設置測試cookie
def login(request): if request.method == 'POST': if request.session.test_cookie_worked(): request.session.delete_test_cookie() return HttpResponse("You're logged in.") else: return HttpResponse("Please enable cookies and try again.") request.session.set_test_cookie() return render_to_response('foo/login_form.html')
django不會自動刪除已通過期的會話數據,記得運行django-admin.py cleanup刪除數據庫中會話表中已通過期的session
一些django的配置可讓你控制session的行爲
Default: django.contrib.sessions.backends.db
可選項:
Default: /tmp/
Default: False
Default: False
是否每次請求都保存session數據
p