session
1.概述
cookie和session的區別
Cookie是儲存在使用者瀏覽器端的鍵值對,Session是儲存在伺服器端的鍵值對;Cookie做使用者驗證的時,敏感資訊不適合放在Cookie中,別人可以分析存放在本地的Cookie並進行Cookie欺騙,考慮到安全應當使用Session;使用者驗證時兩者要結合使用,Session可儲存到檔案,記憶體,資料庫任意地方
2.session操作
(1)獲取
# 獲取Session中資料 request.session['k1'] request.session.get('k1', None)
(2)生成
# 生成Session中資料 request.session['k1'] = 123 request.session.setdefault('k1', 123) # 存在則不設定
(3)刪除
# 刪除Session中某條資料 del request.session['k1'] # 刪除當前使用者的所有Session資料 request.session.delete("session_key") request.session.clear() #登出時可用
(4)鍵值對
# 所有 鍵、值、鍵值對 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems()
(5)超時時間
# 設定超時時間 request.session.set_expiry(value) #預設超時時間為兩週 *如果value是個整數,session會在些秒數後失效。 *如果value是個datatime或timedelta,session就會在這個時間後失效。 *如果value是0, 使用者關閉瀏覽器session就會失效。 *如果value是None, session會依賴全域性session失效策略。
(6)others
# 使用者session的隨機字串 request.session.session_key # 將所有Session失效日期小於當前日期的資料刪除 request.session.clear_expired() # 檢查 使用者session的隨機字串 在資料庫中是否 一般用不到 request.session.exists("session_key")
3.資料庫儲存session
Django預設支援Session,並且預設是將Session資料儲存在資料庫中,即:django_session表中 配置settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(預設) SESSION_COOKIE_NAME = "sessionid" # Session的cookie儲存在瀏覽器上時的key,即:sessionid=隨機字串(預設) SESSION_COOKIE_PATH = "/" # Session的cookie儲存的路徑(預設) SESSION_COOKIE_DOMAIN = None # Session的cookie儲存的域名(預設) SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(預設) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支援http傳輸(預設) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(預設) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過期(預設) SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都儲存Session,預設修改之後才儲存(預設) # 設定Ture後,每次點選頁面,時間更新
4.快取儲存session
配置settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的快取別名(預設記憶體快取,也可以是memcache),此處別名依賴快取的設定 SESSION_COOKIE_NAME = "sessionid" # Session的cookie儲存在瀏覽器上時的key,即:sessionid=隨機字串 SESSION_COOKIE_PATH = "/" # Session的cookie儲存的路徑 SESSION_COOKIE_DOMAIN = None # Session的cookie儲存的域名 SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支援http傳輸 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都儲存Session,預設修改之後才儲存
可以設定為Memcache快取,預設不支援redis(可以使用網上外掛)
配置settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'db' # 使用的快取別名,此處別名依賴快取的設定 CACHES = { 'default': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] }, 'db': { 'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache', 'LOCATION': [ '172.19.26.240:11211', '172.19.26.242:11211', ] } }
5.檔案儲存session
配置 settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 快取檔案路徑,如果為None,則使用tempfile模組獲取一個臨時地址tempfile.gettempdir()
# 如:/var/folders/d3/j9tj0gz93dg06bmwxmhh6_xm0000gn/T SESSION_COOKIE_NAME = "sessionid" # Session的cookie儲存在瀏覽器上時的key,即:sessionid=隨機字串 SESSION_COOKIE_PATH = "/" # Session的cookie儲存的路徑 SESSION_COOKIE_DOMAIN = None # Session的cookie儲存的域名 SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支援http傳輸 SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過期 SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都儲存Session,預設修改之後才儲存
6.快取加資料庫session
資料庫用於做持久化,快取用於提高效率,先去快取中取資料,快取沒有再去資料庫中取,然後在快取中存一份 配置settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
7.加密cookie session
資料都存在於客戶端 配置settings.py SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎
使用者登入
login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="/login/" method="post"> <input type="text" name="user" /> <input type="text" name="pwd" /> <input type="checkbox" name="session" value="1"/> //設定超時時間的 <input type="submit" value="提交" /> </form> </body> </html>
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> {{ request.session.username }} //獲取登入的使用者名稱 </body> </html>
views.py
from django.shortcuts import render,HttpResponse,redirect def login(request): if request.method == 'GET': return render(request ,'login.html') elif request.method == 'POST': user = request.POST.get('user') pwd = request.POST.get('pwd') if user == 'root' and pwd == "123": # 生成隨機字串 # 寫到使用者瀏覽器Cookie # 儲存到Session中 # 在隨機字串對應的字典中設定相關內容... request.session['username'] = user request.session['if_login'] = True # 可不加 直接判斷username也可以 if request.POST.get('session') == '1': # 單獨設定超時時間,當前session生效,不影響全域性 request.session.set_expiry(10) # 10秒 return redirect('/index/') else: return redirect('/login/') def index(request): # 獲取當前使用者的隨機字串 # 根據隨機字串獲取對應資訊 if request.session.get('if_login'): return render(request, 'index.html') else: return redirect('/login/')
登入成功後,瀏覽器可以看到有一個sessionid