8:django sessions(會話)

 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在數據庫中生成對應的表服務器

 使用緩存的會話

若是想要的你的系統表現的更好,你能夠考慮使用基於緩存的後端處理,不過要是緩存的話,你首先要配置你的緩存

 一旦配置好緩存,你有兩個如何在緩存中存儲數據的選擇

  • 使用django.contrib.sessions.backens.cache配置SESSION_ENGIN,會話被直接存儲在緩存中,一旦緩存滿或者緩存服務器重啓,全部的數據將丟失
  • 使用django.contrib.sessions.backends.cached_db配置SESSION_ENGIN,這是一種直寫式的緩存,每次寫入緩存的數據一樣的會被寫到數據庫裏面,僅當會話不在緩存中時纔會訪問數據庫

 這兩種選擇都很快,第一種cache相比cached_db更快由於沒有數據庫交互;但在通常狀況下,cached_db已經夠快的了,若是須要更快,能夠考慮cache

 注意,cached_db也是要用到數據庫的,記得參考上面的 使用數據庫支持的會話

使用基於文件的會話

要使用基於文件的會話,記得把SESSION_ENGIN設爲django.contrib.sessions.backends.file,另外你可能還要設置SESSION_FILE_PATH去控制django存儲會話的地方,前提記得確認django服務器有權限讀寫那個位置

使用基於cookie的會話

要使用基於cookie的會話,只須要把SESSION_ENGIN設置爲django.contrib.sessions.backends.signed_cookies,那些會話數據會使用django的加密簽名工具和SECRET_KEY去存儲數據

提示:建議把SESSION_COOKIE_HTTPONLY=True,這樣能夠防止訪問到javascript存儲的數據

提醒:

  • 會話數據進行了簽名但沒有加密:客戶端能夠讀取甚至更改這些數據,或者cookie的大小超出了瀏覽器默認的長度而被丟棄一部分,這些都會使得會話數據變得無效
  • 不保證新鮮度:MAC(消息驗證碼)能保證數據的真實性和完整性,但卻沒法保證消息的新鮮性,這可能會致使「重放攻擊」,cookie僅當早於SESSION_COOKIE_AGE纔會被認爲是「過期」的
  • 運行表現:cookie的大小對你的網站的訪問速度有影響

 在視圖函數中使用會話

 一旦會話中間件被啓用,每個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對象指南

  • 使用request.session時,像python字符串那樣使用他們
  • 下劃線開始的keys是django內部保留使用的,請不要使用下劃線開頭的變量名
  • 不要覆蓋request.session,就像使用一個python字典類型數據同樣去使用他

 使用例子

 簡單使用:設置並使用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的行爲

SESSION_ENGINE

Default: django.contrib.sessions.backends.db

可選項:

  • 'django.contrib.sessions.backends.db'
  • 'django.contrib.sessions.backends.file'
  • 'django.contrib.sessions.backends.cache'
  • 'django.contrib.sessions.backends.cached_db'
  • 'django.contrib.sessions.backends.signed_cookies'

SESSION_FILE_PATH

Default: /tmp/

SESSION_EXPIRE_AT_BROWSER_CLOSE

Default: False

SESSION_SAVE_EVERY_REQUEST

Default: False

是否每次請求都保存session數據

p

相關文章
相關標籤/搜索