1. django中怎麼設置單個session的失效時間
set_expiry(value):設置cookie的有效期。可以傳遞不同類型的參數值:
• 如果值是一個整數,session將在對應的秒數後失效。例如request.session.set_expiry(300) 將在300秒後失效.
• 如果值是一個datetime或者timedelta對象, 會話將在指定的日期失效
• 如果為0,在用戶關閉瀏覽器後失效
• 如果為None,則將使用全局會話失效策略
失效時間從上一次會話被修改的時刻開始計時。
詳細參考:劉江的django教程
2. Django session是什麼時候設置的
Django的session通過SessionMiddleware中間件實現,在視圖函數開始前以及返回後執行中間件邏輯。
視圖函數中的session['id']=1 是設置內存中的session對象的屬性,而SessionMiddleware的工作是將session對象按指定方式序列化,例如轉換為cookie。
3. django session只能存一個嗎
1. 將Session存儲在資料庫中:
如果要將Session存儲在資料庫中,我們需要將 』django.contrib.sessions』 加入到INSTALLED_APPS 變數中。然後運行 manage.py syncdb 在資料庫中創建相應的存儲Session的資料庫表。
2. 將Session存儲在緩存中:
如果想獲得更好的性能,我們可以將Session保存在緩存中。這里有兩種配置方式:一種是設置SESSION_ENGINE 為」django.contrib.sessions.backends.cache」 。這是一種簡單配置,Session將之被保存在緩存中,但是不保證Session總是能取到(比如緩存溢出時Session會丟失);另一種方式是設置SESSION_ENGINE 為 「django.contrib.sessions.backends.cached_db」。這種方式下,Session在保存到緩存的同時還會被保存到資料庫中,當Django在緩存中找不到Session時,會從資料庫中找到。第二種方式會有一點點性能開銷,但是安全性和冗餘性更好。
3. 將Session存儲在文件系統中:
最後一種方式是將Session存儲在文件系統中。需要設置SESSION_ENGINE 為」django.contrib.sessions.backends.file」,這時你還需要同時設置SESSION_FILE_PATH 變數,它代表Session文件保存的位置,預設的設置一般是tempfile.gettempdir(),表示系統的臨時目錄。這里要確保應用程序對那個目錄有讀寫的許可權。
4. django中的通用視圖(類視圖),如何獲得和設置session
HttpSession session = request.getSession();
session.getAttribute(「名稱」);------得到session放入進去的信息。
session.getAttributeNames()-----得到session裡面所有的信息名稱。
session.getMaxInactiveInterval()----得到session最大存活時間。
seesion.getId();------得到session的id。比較有用的屬性,可以實現共享session。
session.getCreationTime()-----session創建時間。
。。。。。。。。。。。
還有比較多的屬性都可以得到session的配置信息。同樣,也可以在web.xml文件中通過<session-config>設置session的屬性。
5. vue+django使用session的用戶驗證怎麼做
和朋友合作一個小項目,我負責前端,他負責後台,目前對用戶登陸驗證這塊不太明白應該怎麼做。了解了下有傳統session的方式和access token的方式。
access token的方式我大概明白前端的工作具體怎麼做,用戶名密碼驗證通過後後台返回一個token,以後前端路由加http攔截所有的請求頭都要附上這個token。但是後台的操作會比較麻煩。
6. django 中session 怎麼設置timeout
Django 完全支持匿名 Session Session 框架允許每用戶保存並取數據數據保存伺服器端並發送接收 Cookie 操作包裝起 Cookie 包含 Session ID數據本身 啟用 Sessions¶ Session 通 間件 式實現 要啟用 Session 功能需要完步驟: 修改 MIDDLEWARE_CLASSES 設置並確定其包含 'django.contrib.sessions.middleware.SessionMiddleware' ``django-admin.py startproject`` 所創建預設 settings.py 已經激 SessionMiddleware 'django.contrib.sessions' 添加 INSTALLED_APPS 設置並執行 manage.py syncdb 便安裝用於存儲 Session 數據表格 Changed in Django 依.0: 並未使用資料庫存儲 Session則步驟忽略;參考 配置 Session 引擎 If you don』t want to use sessions, you might as well remove the SessionMiddleware line from MIDDLEWARE_CLASSES and 'django.contrib.sessions' from your INSTALLED_APPS. It』ll save you a small bit of overhead. 配置 Session 引擎¶ New in Django 依.0.. 預設情況Django Session 存儲資料庫 (使用模型 django.contrib.sessions.models.Session)盡管便某些情況 Session 放其速度更快 Django 允許您通配置讓 Session 數據保存文件系統或緩沖區 使用基於文件 Session¶ 要使用基於文件 Session請 SESSION_ENGINE 設置 "django.contrib.sessions.backends.file" 您能需要修改 SESSION_FILE_PATH 設置便控制 Django 存儲 Session 文件位置預設情況使用 tempfile.gettempdir() 通 /tmp 使用基於緩沖區 Session¶ 要使用 Django 緩沖區系統保存 Session需要 SESSION_ENGINE 設置 "django.contrib.sessions.backends.cache" 您必須確保您已經配置緩沖區詳情請參考 緩沖區文檔 Note 使用 Memcached 作緩沖台才能使用基於緩沖區 Session本內存作緩沖台存儲緩沖數據間太短直接訪問文件或資料庫速度要比通緩沖區訪問文件或資料庫速度更快些 視圖使用 Session¶ 啟 SessionMiddleware 每 HttpRequest 象 (Django 視圖函數第參數) 救火 session 屬性類字典象您直接其讀寫 Session 象標准字典函數: __getitem__(key) 例: fav_color = request.session['fav_color'] __setitem__(key, value) 例: request.session['fav_color'] = 'blue' __delitem__(key) 例: del request.session['fav_color']. This raises KeyError if the given key isn』t already in the session. __contains__(key) 例: 'fav_color' in request.session get(key, default=None) 例: fav_color = request.session.get('fav_color', 'red') keys() items() setdefault() clear() New in Django 依.0: setdefault() clear() 版本新加 : flush() New in Django 依.0. 資料庫刪除前 Session 數據並且重新 Session 鍵並其發送給瀏覽器用於需要確保 Session 數據再用戶瀏覽器訪問譬調用 django.contrib.auth.logout() set_test_cookie() 設定檢測 Cookie 檢驗用戶瀏覽器否支持 Cookie Cookie 工作式用戶請求前您都測試結詳情參考面 設置檢測 Cookie test_cookie_worked() 判斷用戶瀏覽器否收檢測 Cookie並返 True 或 False Cookie 工作式您必須前獨立請求調用 set_test_cookie() 詳情參考面 設置檢測 Cookie delete_test_cookie() 刪除檢測 Cookie請自調用函數便清除該 Cookie set_expiry(value) New in Django 依.0. 設定 Session 期間您提供述幾種形式值: value 整形則表示秒例調用 request.session.set_expiry(三00) 讓 Session 五鍾期 value datetime 或 timedelta 象則 Session 相應期或間點期 value is 0 則用戶 Session 瀏覽器關閉期 value is None 則 Session 使用全局策略設定期間 get_expiry_age() New in Django 依.0. 獲 Session 期間於沒自定義期間 Session (或瀏覽器關閉期 Session)函數返值與 settings.SESSION_COOKIE_AGE 相同 get_expiry_date() New in Django 依.0. 獲 Session 期間點於沒自定義期間 Session (或瀏覽器關閉期 Session)函數返值等於現間點 settings.SESSION_COOKIE_AGE 秒數 get_expire_at_browser_close() New in Django 依.0. 返 Session 否瀏覽器關閉期返值 True 或 False 您視圖任何位置都修改 request.session 改少都行 Session 象指南¶ 直接 request.session 使用 Python 字元串作字典鍵比使用 Session 象更直接 Session 字典劃線始鍵保留給 Django 內部使用 要用新象覆蓋 request.session 要訪問或修改屬性能作類字典象使用 例¶ 簡單視圖用戶提交評價信息變數 has_commented 設定 True 防止用戶提交評價信息: 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!') 簡單視圖讓中國站用戶登錄: def login(request): m = Member.objects.get(username=request.POST['username']) if m.password == request.POST['password']: request.session['member_id'] = m.id return HttpResponse("You're logged in.") else: return HttpResponse("Your username and password didn't match.") ...與面例相應面例則讓用戶退: def logout(request): try: del request.session['member_id'] except KeyError: pass return HttpResponse("You're logged out.") 實際標准 django.contrib.auth.logout() 做些事情防止疏忽造數據泄露調用 request.session.flush() 函數我使用些例演示何操作 Session 象完整 logout() 實現 設置檢測 Cookie¶ 便起見Django 提供種簡單檢測用戶瀏覽器否支持 Cookie要請求調用 request.session.set_test_cookie() 並續請求調用 request.session.test_cookie_worked() 即注意千萬要同請求同調用 所要兩請求調用 set_test_cookie() test_cookie_worked() Cookie 工作模式您設定 Cookie 再請求前都沒辦知道瀏覽器否接收 另外測試完畢使用 delete_test_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') 視圖外使用 Session¶ New in Django 依.0. API 專門用於視圖外操作 Session 數據: >>> from django.contrib.sessions.backends.db import SessionStore >>> s = SessionStore(session_key='貳b依依吧9a依吧吧b四四ad依吧c三5e依依三ac陸ceead') >>> s['last_login'] = datetime.datetime(貳005, 吧, 貳0, 依三, 三5, 依0) >>> s['last_login'] datetime.datetime(貳005, 吧, 貳0, 依三, 三5, 0) >>> s.save() 您使用 django.contrib.sessions.backends.db 台則每 Session 都普通 Django 模型模型 Session 文件 django/contrib/sessions/models.py 定義由於普通模型您使用 Django 資料庫編程介面直接訪問: >>> from django.contrib.sessions.models import Session >>> s = Session.objects.get(pk='貳b依依吧9a依吧吧b四四ad依吧c三5e依依三ac陸ceead') >>> s.expire_date datetime.datetime(貳005, 吧, 貳0, 依三, 三5, 依貳) 注意要獲 Session 字典需要調用 get_decoded() 字典編碼式存儲: >>> s.session_data 'KGRwMQpTJ依9hdXRoX三VzZXJfaWQnCnAyCkkxCnMuMTExY貳ZjODI貳Yj...' >>> s.get_decoded() {'user_id': 四貳} Session 何存儲¶ 預設情況Django Session 修改才保存即字典值修改或刪除: # Session is modified. request.session['foo'] = 'bar' # Session is modified. del request.session['foo'] # Session is modified. request.session['foo'] = {} # Gotcha: Session is NOT modified, because this alters # request.session['foo'] instead of request.session. request.session['foo']['bar'] = 'baz' 於面通顯示設定 Session 象 modified 屬性通知 Session 象修改: request.session.modified = True 要改變種行 SESSION_SAVE_EVERY_REQUEST 設定 True SESSION_SAVE_EVERY_REQUEST True 則 Django 每獨立請求都保存 Session 注意創建或修改 Session 候才送 Session Cookie SESSION_SAVE_EVERY_REQUEST True 則每請求都送 Cookie 同送 Cookie expires 部每都更新 與瀏覽器同步 Session 持久 Session¶ 通設置 SESSION_EXPIRE_AT_BROWSER_CLOSE 您控制 Session 框架使用與瀏覽器同步 Session 或持久 Session 預設情況 SESSION_EXPIRE_AT_BROWSER_CLOSE 值 False 表示 Session Cookie 保存用戶瀏覽器直超 SESSION_COOKIE_AGE 您希望用戶必每關閉瀏覽器都重新登陸請使用種式 SESSION_EXPIRE_AT_BROWSER_CLOSE 設定 True 則 Django 使用與瀏覽器同步 Cookie即用戶關閉瀏覽器 Cookie 期您希望用戶每打瀏覽器都必須登錄請使用種模式 New in Django 依.0. 設置具全局預設值通調用 request.session.set_expiry() 每 Session 設定獨立值相關內容述 視圖使用 Session 所闡述 清空 Session 表格¶ 注意Session 數據能堆積資料庫表格 django_session Django 提供 自清除功能定期清空 Session 數據任務留給您 要理解問題想像用戶使用 Session 發用戶登錄Django 向表格 django_session 添加條記錄每 Session 數據變化Django 更新條記錄用戶手工退Django 刪除用戶 沒 退則條記錄永遠都刪除 Django 提供能夠完清除功能例腳本 django-admin.py cleanup Session 表格刪除些 expire_date 已經期記錄您應用程序能其需求 設置¶ 些 Django 設置 幫助您控制 Session 行: SESSION_ENGINE¶ New in Django 依.0. 預設值: django.contrib.sessions.backends.db 控制 Django 何處保存 Session 數據合值: 'django.contrib.sessions.backends.db' 'django.contrib.sessions.backends.file' 'django.contrib.sessions.backends.cache' 詳情請參考 配置 Session 引擎 SESSION_FILE_PATH¶ New in Django 依.0. 預設值: /tmp/ 您使用基於文件 Session 存儲則變數控制著 Django 存儲 Session 數據目錄 SESSION_COOKIE_AGE¶ 預設值: 依貳09陸00 (兩周秒錶示) Session Cookie 期間秒錶示 SESSION_COOKIE_DOMAIN¶ 預設值: None Session Cookie 域要設定跨域 Cookie其設定 ".lawrence中國" 形式否則請使用 None SESSION_COOKIE_NAME¶ 預設值: 'sessionid' Session 所使用 Cookie 名稱根據需要設定 SESSION_COOKIE_SECURE¶ 預設值: False 於 Session Cookie否要使用安全模式設定 True 則 Cookie 標記安全種情況瀏覽器需要確定該 Cookie 否通 HTTPS 連接發送 SESSION_EXPIRE_AT_BROWSER_CLOSE¶ 預設值: False 否用戶關閉瀏覽器讓 Session 期詳情參考文 與瀏覽器同步 Session 持久Session SESSION_SAVE_EVERY_REQUEST¶ 預設值: False 否每請求都保存 Session 數據項 False (預設值)則 Session 數據修改才保存即字典值賦值或刪除 技術細節¶ Session 字典接受任何與 pickle 兼容 Python 象詳情參考 pickle 模塊 Session 數據存儲資料庫表格 django_session Django 需要候才發送 Cookie您沒設定任何 Session 數據送 Cookie URL Session ID¶ Django Session 框架完全基於 Cookie 並且能基於 Cookie像些軟體(譬 PHP) Session 能工作 Session ID 放 URL 作決定經深思熟慮種僅使 URL 醜陋並且 Session ID 能通 Referer 泄漏給中國站帶安全隱
7. django 使用自帶logout會刪除session么
deflogout(request):
"""
Removestheauthenticateser'
sessiondata.
"""
#
#chancetofindout*who*loggedout.
user=getattr(request,'user',None)
ifhasattr(user,'is_authenticated')andnotuser.is_authenticated():
user=None
user_logged_out.send(sender=user.__class__,request=request,user=user)
request.session.flush()
ifhasattr(request,'user'):
fromdjango.contrib.auth.modelsimportAnonymousUser
request.user=AnonymousUser()
上面就是django的logout代碼,django並沒有真正的刪除session,只是取消了和當前瀏覽器的關聯,也就是刪除了sessionid。
如果解決了您的問題請採納!
如果未解決請繼續追問!
8. 如何使用django session
Django 完全支持匿名 Session。 Session 框架允許每一個用戶保存並取回數據。它將數據保存在伺服器端,並將發送和接收 Cookie 的操作包裝起來。在 Cookie 中包含的是 Session ID,而不是數據本身。
啟用 Sessions¶
Session 是通過 中間件 的方式實現的。
要啟用 Session 的功能,需要完成以下步驟:
修改 MIDDLEWARE_CLASSES 設置,並確定其中包含了 'django.contrib.sessions.middleware.SessionMiddleware' 。``django-admin.py startproject`` 所創建的預設的 settings.py 就已經激活了 SessionMiddleware 。
將 'django.contrib.sessions' 添加到你的 INSTALLED_APPS 設置中,並執行 manage.py syncdb 以便安裝用於存儲 Session 數據的表格。
Changed in Django 1.0: 如果你並未使用資料庫存儲 Session,則此步驟可以忽略;參考 配置 Session 引擎 。
If you don』t want to use sessions, you might as well remove the SessionMiddleware line from MIDDLEWARE_CLASSES and 'django.contrib.sessions' from your INSTALLED_APPS. It』ll save you a small bit of overhead.
配置 Session 引擎¶
New in Django 1.0..
預設情況下,Django 將 Session 存儲在資料庫中 (使用模型 django.contrib.sessions.models.Session)。盡管這很方便,但在某些情況下,把 Session 放在其它的地方速度會更快。因此 Django 允許您通過配置讓它將 Session 數據保存在文件系統或緩沖區中。
使用基於文件的 Session¶
要使用基於文件的 Session,請將 SESSION_ENGINE 設置為 "django.contrib.sessions.backends.file" 。
您可能還需要修改 SESSION_FILE_PATH 這一設置以便控制 Django 存儲 Session 文件的位置,預設情況下,它使用 tempfile.gettempdir() ,通常是 /tmp 。
使用基於緩沖區的 Session¶
要使用 Django 的緩沖區系統來保存 Session,需要將 SESSION_ENGINE 設置為 "django.contrib.sessions.backends.cache" 。您必須確保您已經配置了緩沖區,詳情請參考 緩沖區文檔 。
Note
只有在使用 Memcached 作為緩沖後台時,才能使用基於緩沖區的 Session。因為以本地內存作為緩沖後台時,它存儲緩沖數據的時間太短了,這樣直接訪問文件或資料庫的速度,要比通過緩沖區訪問文件或資料庫的速度更快一些。
在視圖中使用 Session¶
在開啟 SessionMiddleware 後,每一個 HttpRequest 對象 (Django 視圖函數的第一個參數) 救火有一個 session 屬性,它是一個類字典對象。您可以直接對其讀寫。
Session 對象有以下標准字典函數:
__getitem__(key)
例子: fav_color = request.session['fav_color']
__setitem__(key, value)
例子: request.session['fav_color'] = 'blue'
__delitem__(key)
例子: del request.session['fav_color']. This raises KeyError if the given key isn』t already in the session.
__contains__(key)
例子: 'fav_color' in request.session
get(key, default=None)
例子: fav_color = request.session.get('fav_color', 'red')
keys()
items()
setdefault()
clear()
New in Django 1.0: setdefault() 和 clear() 是在這個版本新加的。
它還有如下方法:
flush()
New in Django 1.0.
從資料庫中刪除當前的 Session 數據並且重新生成一個 Session 鍵,並將其發送給瀏覽器。這用於需要確保 Session 數據無法再從用戶瀏覽器訪問時,譬如調用 django.contrib.auth.logout() 時。
set_test_cookie()
設定檢測 Cookie 以檢驗用戶的瀏覽器是否支持 Cookie。因 Cookie 的工作方式,在下一次用戶請求之前,您都無法得到測試結果。詳情參考下面的 設置檢測 Cookie 。
test_cookie_worked()
判斷用戶的瀏覽器是否收到了檢測 Cookie,並返回 True 或 False 。因 Cookie 的工作方式,您必須在之前的獨立請求中調用 set_test_cookie() 。詳情參考下面的 設置檢測 Cookie 。
delete_test_cookie()
刪除檢測 Cookie,請自己調用此函數以便清除該 Cookie。
set_expiry(value)
New in Django 1.0.
設定 Session 的過期時間。您可以提供下述幾種形式的值:
如果 value 是整形,則它表示的是秒。例如,調用 request.session.set_expiry(300) 會讓 Session 在五分鍾後過期。
如果 value 是 datetime 或 timedelta 對象,則 Session 將會在相應的日期或時間點過期。
如果 value is 0 ,則用戶的 Session 會在瀏覽器關閉時過期。
如果 value is None ,則 Session 會使用全局策略來設定過期時間。
get_expiry_age()
New in Django 1.0.
獲得此 Session 的過期時間。對於沒有自定義過期時間的 Session (或在瀏覽器關閉時過期的 Session),此函數返回值與 settings.SESSION_COOKIE_AGE 相同。
get_expiry_date()
New in Django 1.0.
獲得此 Session 的過期時間點。對於沒有自定義過期時間的 Session (或在瀏覽器關閉時過期的 Session),此函數的返回值等於從現在到時間點 settings.SESSION_COOKIE_AGE 的秒數。
get_expire_at_browser_close()
New in Django 1.0.
返回 Session 是否會在瀏覽器關閉時過期,返回值為 True 或 False 。
您在視圖中的任何位置都可以修改 request.session ,改多少次都行。
Session 對象指南¶
直接在 request.session 上使用 Python 字元串作為字典的鍵,這比使用 Session 對象的方法來得更直接。
在 Session 字典中,以下劃線開始的鍵,是保留給 Django 在內部使用的。
不要用一個新的對象覆蓋 request.session ,也不要訪問或修改它的屬性,它只能作為一個類字典對象使用。
例子¶
這個簡單的視圖在用戶提交了評價信息後,將變數 has_commented 設定為 True ,這樣就可以防止用戶多次提交評價信息:
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!')
這個簡單的視圖讓網站的「用戶」登錄:
def login(request): m = Member.objects.get(username=request.POST['username']) if m.password == request.POST['password']: request.session['member_id'] = m.id return HttpResponse("You're logged in.") else: return HttpResponse("Your username and password didn't match.")
...與上面的例子相對應的,下面的例子則讓用戶退出:
def logout(request): try: del request.session['member_id'] except KeyError: pass return HttpResponse("You're logged out.")
實際上標準的 django.contrib.auth.logout() 還會多做一些事情從而防止因疏忽造成的數據泄露。它會調用 request.session.flush() 函數。我們使用這些例子只是演示如何操作 Session 對象,它可不是一個完整的 logout() 實現。
設置檢測 Cookie¶
為方便起見,Django 提供了一種簡單的方法來檢測用戶的瀏覽器是否支持 Cookie。只要在一個請求中調用 request.session.set_test_cookie() 並在後續請求中調用 request.session.test_cookie_worked() 即可。注意千萬不要在同一次請求中同時調用。
之所以要在兩次請求中調用 set_test_cookie() 和 test_cookie_worked() 是因為 Cookie 的工作模式。當您設定了 Cookie 後,再下一次請求前,都是沒有辦法知道瀏覽器是否會接收它的。
另外最好在測試完畢後,使用 delete_test_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')
在視圖外使用 Session¶
New in Django 1.0.
有一個 API 專門用於在視圖之外操作 Session 數據:
>>> from django.contrib.sessions.backends.db import SessionStore >>> s = SessionStore(session_key='') >>> s['last_login'] = datetime.datetime(2005, 8, 20, 13, 35, 10) >>> s['last_login'] datetime.datetime(2005, 8, 20, 13, 35, 0) >>> s.save()
如果您使用了 django.contrib.sessions.backends.db 後台,則每一個 Session 都是一個普通的 Django 模型。模型 Session 在文件 django/contrib/sessions/models.py 中定義。由於它是一個普通的模型,因此您可以使用 Django 的資料庫編程介面直接訪問它:
>>> from django.contrib.sessions.models import Session >>> s = Session.objects.get(pk='') >>> s.expire_date datetime.datetime(2005, 8, 20, 13, 35, 12)
注意,要獲得 Session 字典,需要調用 get_decoded() ,這是因為字典是以編碼的方式存儲的:
>>> s.session_data '...' >>> s.get_decoded() {'user_id': 42}
Session 是何時存儲的¶
預設情況下,Django 只在 Session 被修改時才會保存它,即只有字典中的值被修改或刪除時:
# Session is modified. request.session['foo'] = 'bar' # Session is modified. del request.session['foo'] # Session is modified. request.session['foo'] = {} # Gotcha: Session is NOT modified, because this alters # request.session['foo'] instead of request.session. request.session['foo']['bar'] = 'baz'
對於在上面的最後一個,通過顯示地設定 Session 對象的 modified 屬性,可以通知 Session 對象它被修改了:
request.session.modified = True
要改變這種行為,可以將 SESSION_SAVE_EVERY_REQUEST 設定為 True 。如果 SESSION_SAVE_EVERY_REQUEST 是 True ,則 Django 在每一次獨立的請求之後都會保存 Session。
注意,只有在創建或修改 Session 的時候才會送出 Session Cookie,如果 SESSION_SAVE_EVERY_REQUEST 為 True ,則每次請求都會送出 Cookie。
同樣地,在送出 Cookie 時,它的 expires 部分每次都會被更新。
與瀏覽器同步的 Session 和持久的 Session¶
通過設置 SESSION_EXPIRE_AT_BROWSER_CLOSE ,您可以控制 Session 框架使用與瀏覽器同步的 Session 或持久的 Session。
預設情況下, SESSION_EXPIRE_AT_BROWSER_CLOSE 的值為 False ,這表示 Session Cookie 將會保存在用戶的瀏覽器中,直到超過了 SESSION_COOKIE_AGE 。如果您希望用戶不必在每次關閉瀏覽器後都重新登陸,請使用這種方式。
如果 SESSION_EXPIRE_AT_BROWSER_CLOSE 設定為 True ,則 Django 會使用與瀏覽器同步的 Cookie,即用戶關閉瀏覽器時 Cookie 就會過期。如果您希望用戶每次打開瀏覽器都必須登錄,請使用這種模式。
New in Django 1.0.
這個設置具有全局的預設值,但可以通過調用 request.session.set_expiry() 為每個 Session 設定獨立的值,相關內容在上述的 在視圖中使用 Session 中有所闡述。
清空 Session 表格¶
注意,Session 數據有可能堆積在資料庫表格 django_session 中,Django 不提供 自動清除它們的功能。它把定期清空 Session 數據的任務留給了您。
要理解這個問題,想像一下用戶使用 Session 時會發生什麼。當用戶登錄,Django 向表格 django_session 中添加一條記錄。每當 Session 數據變化時,Django 會更新這條記錄。如果用戶手工退出了,Django 會刪除它。但是,如果用戶 沒有 退出,則這條記錄永遠都不會被刪除。
Django 提供了一個能夠完成清除功能的樣例腳本 django-admin.py cleanup ,它從 Session 表格中刪除那些 expire_date 已經過期的記錄,但是您的應用程序可能會有其它的需求。
設置¶
一些 Django 設置 可以幫助您控制 Session 的行為:
SESSION_ENGINE¶
New in Django 1.0.
預設值: django.contrib.sessions.backends.db
控制 Django 在何處保存 Session 數據,合法的值為:
'django.contrib.sessions.backends.db'
'django.contrib.sessions.backends.file'
'django.contrib.sessions.backends.cache'
詳情請參考 配置 Session 引擎 。
SESSION_FILE_PATH¶
New in Django 1.0.
預設值: /tmp/
如果您使用基於文件的 Session 存儲,則此變數控制著 Django 存儲 Session 數據的目錄。
SESSION_COOKIE_AGE¶
預設值: 1209600 (兩周,以秒錶示)
Session Cookie 的過期時間,以秒錶示
SESSION_COOKIE_DOMAIN¶
預設值: None
Session Cookie 的域。如果是要設定跨域的 Cookie,可以將其設定為 ".lawrence.com" 的形式,否則請使用 None 。
SESSION_COOKIE_NAME¶
預設值: 'sessionid'
Session 所使用的 Cookie 的名稱,可根據需要設定。
SESSION_COOKIE_SECURE¶
預設值: False
對於 Session Cookie,是否要使用安全模式。如果將此設定為 True ,則 Cookie 將會被標記為「安全」,這種情況下,瀏覽器就需要確定該 Cookie 是否是通過 HTTPS 連接發送的。
SESSION_EXPIRE_AT_BROWSER_CLOSE¶
預設值: False
是否當用戶關閉瀏覽器時就讓 Session 過期。詳情參考上文 與瀏覽器同步的 Session 和持久的Session 。
SESSION_SAVE_EVERY_REQUEST¶
預設值: False
是否在每次請求時都保存 Session 數據。如果此項為 False (預設值),則 Session 數據只有在它被修改後才會保存,即它的字典值被賦值或刪除時。
技術細節¶
Session 字典可以接受任何與 pickle 兼容的 Python 對象,詳情參考 pickle 模塊 。
Session 數據存儲在資料庫表格 django_session 中。
Django 只在需要的時候才發送 Cookie,如果您沒有設定任何的 Session 數據,它不會送出 Cookie。
URL 中的 Session ID¶
Django 的 Session 框架是完全基於 Cookie 的,並且它也只能基於 Cookie。它不會像一些軟體(譬如 PHP)那樣在 Session 不能正常工作時,把 Session ID 放到 URL 中。作出這一決定是經過深思熟慮的,那種方法不僅使得 URL 很醜陋,並且 Session ID 還有可能通過 「Referer」 頭泄漏出去,從而給網站帶來安全隱患。
9. 用Django和前端做的網站,首頁登陸存了session和cookies,其他頁面不怎麼改變登錄狀態,求各位大神代碼示範
進入頁面前,
判斷session和cookies是否存在用戶信息,
有渲染頁面,沒有提示跳轉去登錄