session和cookie關系:session依賴於cookie
基於cookie做用戶驗證時,敏感信息不適合放在cookie中
原理:
cookie定義:保存在用戶游覽器端的鍵值對
session定義:保存在服務器端的鍵值對
session原理:客戶端發起登錄請求,服務器端通過驗證后,生成隨機字符串返回給客戶端,並且服務器端將此字符串和客戶端信息存儲
到本地數據庫中,用於客戶端下次登錄驗證。
session 和 cookie 區別
cookie只是保存在客戶端游覽器的內容為鍵值對的文件,session是存儲在服務器端的,可以文件,緩存,數據庫形式存在,隨機字串和數據
存儲在服務器端,只將隨機字符串返回給客戶端
以下為一個帳號登錄實例:
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':
# 設置session帳號登錄名稱及登錄狀態
request.session['username'] = user
request.session['is_login'] = True
request.session.set_expiry(10) # sesson超時時間10秒
return redirect('/index/')
else:
return render(request,'login.html')
def index(request):
# 獲取session值
if request.session.get('is_login',None):
return render(request,'index.html',{'username':request.session['username']})
def logout(request):
# 刪除所有session,進行當前登錄注銷
request.session.clear()
return redirect('/login')
View Code
操作介紹:
request.session['k1'] # 獲取k1的值,不存在則報錯
request.session.get('k1',None) # 獲取k1的值,不存在則返回None
request.session['k1'] = 123 # 不存在則創建,存在則更新
request.session.setdefault('k1',123) # 不存在則創建默認值,存在則不作操作
del request.session['k1'] # 刪除k1
鍵,值,鍵值對操作
request.session.keys() # 提取所有鍵
request.session.values() # 提取所有值
request.session.iterkeys() # 迭代鍵
request.session.itervalues() # 迭代值
request.session.iteritems() # 迭代鍵值
request.session.session_key # 用來獲取session字符串
request.session.clear_expired() # 清除所有已超過自身設定超時時間的session
request.session.exists('session_key') # 檢查session字串在數據庫中是否存在
request.session.delete('session_key') # 刪除當前用戶的所有session數據
request.session.clear() # 清除用戶的所有session數據,用於注銷
request.session.set_expiry(value): 設置session超時時間,默認2周
# 如果value是個整數,session會在value秒后失效,
# 如果value是個datatime或timedelta,session會在這個時間后失效
# 如果value是0,用戶關閉游覽器session會失效
# 如果value是None,session會依賴全局session失效策略
配置文件setting中設置默認操作:
SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認),表示session默認存儲在數據庫中
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,默認修改之后才保存(默認)
主要:SESSION_SAVE_EVERY_REQUEST = True # 超時時間按照每次訪問之后開啟計算
session存儲位置如下:引擎配置
1:數據庫(默認)
2:緩存配置:
SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎
SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認內存緩存,也可以是memcache),此處別名依賴緩存的設置
memcache寫法:
CACHES = {
'default': { # 這里的default就是上面緩存配置的default
'BACKEND': 'django.core.cache.backends.memcached.PyLibMCCache',
'LOCATION': [
'172.19.26.240:11211',
'172.19.26.242:11211',
]
}
}
3:文件配置:
SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎
SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir()
4:緩存+數據庫
SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎
5:加密cookie session
SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎,加密后放入cookie