Django進階之session
基于cookie做用戶驗證時:敏感信息不適合放在cookie中
session依賴cookie
session原理
cookie是保存在用戶瀏覽器端的鍵值對
session是保存在服務器端的鍵值對
?
session服務端中存在的數據為:
session = {隨機字符串1:{用戶1的相關信息}隨機字符串2:{用戶2的相關信息}}
session客戶端即客戶端的瀏覽器的cookie中存的數據是當前用戶對應的隨機字符串
session的工作過程
1、??? 生成隨機字符串
2、??? 寫到用戶瀏覽器的cookie中
3、??? 保存到session中
4、??? 在隨機字符串對應的字典中設置相關內容
而上述過程在Django中的體現為:
request.session["username"]=user
這里的username為通過request.POST.get("username")從前端html頁面中獲取到的用戶名信息
注意:
在Django中要用session中一定要先執行:
python manage.py makemigrations
python manage.py migrate
?
當用戶登錄的時候的就會在數據庫的django_session表中記錄session信息
?
同樣的通過request.session["username"]也可以獲取相應的值
在這個過程中:
1、??? 首先獲取當前用戶的隨機字符串
2、??? 根據隨機字符串獲取對應的內容
?
session的操作
?
request.session["k1"]? 如果不存在則會報錯
request.session.get["k1"],如果不存在則會報錯,為了防止出錯可以request.session.get('k1',none)
?
request.session['k1'] = 123 設置session值
request.session.setdefault('k1',123) ?存在則不設置
del request.session['k1']? 刪除
request.session.clear()??? 刪除
?
所有 鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()
?
用戶session的隨機字符串
request.session.session_key
?
將所有Session失效日期小于當前日期的數據刪除
request.session.clear_expired()
?
檢查 用戶session的隨機字符串 在數據庫中是否
request.session.exists("session_key")
?
刪除當前用戶的所有Session數據
request.session.delete("session_key")
?
request.session.set_expiry(value)
默認的過期時間是兩周,如果自己設置了過期時間,這樣自己設定的優先級就會高于默認的
如果value是個整數,session會在些秒數后失效。
如果value是個datatime或timedelta,session就會在這個時間后失效。
如果value是0,用戶關閉瀏覽器session就會失效。
如果value是None,session會依賴全局session失效策略。
?
配置setting.py
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,默認修改之后才保存(默認)
?
Django中對于session的存儲方式
Django中支持session,其中內部提供了5種類型的session供開發者使用:
數據庫(默認)
緩存
文件
緩存+數據庫
加密cookie
1、如果是數據庫,需要在settings.py中配置如下:
SESSION_ENGINE = 'django.contrib.sessions.backends.db' (引擎(默認))
2、如果是緩存session,需要在settings.py中配置如下:
SESSION_ENGINE = 'django.contrib.sessions.backends.cache'(引擎)
SESSION_CACHE_ALIAS= 'default' ?使用的緩存別名(默認內存緩存,也可以是memcache),此處別名依賴緩存的設置
1、??? 如果是文件session, 需要在settings.py中配置如下:
SESSION_ENGINE = 'django.contrib.sessions.backends.file' (引擎)
SESSION_FILE_PATH=None? 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()???
2、??? 如果是緩存+數據庫session,需要在settings.py中配置如下:
SESSION_ENGINE='django.contrib.sessions.backends.cached_db'?????? (引擎)
?
來源于:昵稱:python修行路