Session (簡介、、相關方法、流程解析、登入驗證)
阿新 • • 發佈:2018-12-25
Session簡介
Session的由來
Cookie雖然在一定程度上解決了“保持狀態”的需求,但是由於Cookie本身最大支援4096位元組,以及Cookie本身儲存在客戶端,可能被攔截或竊取,因此就需要有一種新的東西,它能支援更多的位元組,並且他儲存在伺服器,有較高的安全性。這就是Session。
問題來了,基於HTTP協議的無狀態特徵,伺服器根本就不知道訪問者是“誰”。那麼上述的Cookie就起到橋接的作用。
我們可以給每個客戶端的Cookie分配一個唯一的id,這樣使用者在訪問時,通過Cookie,伺服器就知道來的人是“誰”。然後我們再根據不同的Cookie的id,在伺服器上儲存一段時間的私密資料,如“賬號密碼”等等。
總結而言:Cookie彌補了HTTP無狀態的不足,讓伺服器知道來的人是“誰”;但是Cookie以文字的形式儲存在本地,自身安全性較差;所以我們就通過Cookie識別不同的使用者,對應的在Session裡儲存私密的資訊以及超過4096位元組的文字。
另外,上述所說的Cookie和Session其實是共通性的東西,不限於語言和框架。
Session相關方法
# 獲取、設定、刪除Session中資料 request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123request.session.setdefault('k1',123) # 存在則不設定 del request.session['k1'] # 所有 鍵、值、鍵值對 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 會話session的key request.session.session_key # 將所有Session失效日期小於當前日期的資料刪除 request.session.clear_expired() # 檢查會話session的key在資料庫中是否存在 request.session.exists("session_key") # 刪除當前會話的所有Session資料 request.session.delete() # 刪除當前的會話資料並刪除會話的Cookie。 request.session.flush() 這用於確保前面的會話資料不可以再次被使用者的瀏覽器訪問 例如,django.contrib.auth.logout() 函式中就會呼叫它。 # 設定會話Session和Cookie的超時時間 request.session.set_expiry(value) * 如果value是個整數,session會在些秒數後失效。 * 如果value是個datatime或timedelta,session就會在這個時間後失效。 * 如果value是0,使用者關閉瀏覽器session就會失效。 * 如果value是None,session會依賴全域性session失效策略。
Session流程解析
Session配置
1. 資料庫Session SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(預設) 2. 快取Session SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的快取別名(預設記憶體快取,也可以是memcache),此處別名依賴快取的設定 3. 檔案Session 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' # 引擎 其他公用設定項: 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登入驗證
總體來說跟Cookie驗證是一個流程,只是這些資訊儲存在伺服器。
試圖
from django.shortcuts import render,HttpResponse,redirect from app01.models import * # Create your views here. def login(request): #賦值 if request.method == 'POST': user = request.POST.get('user') pwd = request.POST.get('pwd') user_obj = User_info.objects.filter(user=user,pwd=pwd).first() #驗證登入資訊 if user_obj: import datetime now_time = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S") #session中新增相關資訊,我這裡新增的是登入使用者名稱及登入時間 request.session['last_time'] = now_time request.session['user'] = user ''' if request.COOKIE.get("sessionid"): 更新 在django—session表中建立一條記錄: session-key session-data ltv8zy1kh5lxj1if1fcs2pqwodumr45t 更新資料 else: 1 生成隨機字串 ltv8zy1kh5lxj1if1fcs2pqwodumr45t 2 response.set_cookie("sessionid",ltv8zy1kh5lxj1if1fcs2pqwodumr45t) 3 在django—session表中建立一條記錄: session-key session-data ltv8zy1kh5lxj1if1fcs2pqwodumr45t {"is_login":True,"username":"yuan"} ''' return redirect('/index/') return render(request,'login.html') def index(request): #判斷當前瀏覽器是否可以獲取到Session 資訊,如果可以則顯示前端模板,否則返回登入頁面 if request.session.get('user'): session_user = request.session['user'] session_last_time = request.session['last_time'] return render(request, 'index.html', locals()) return redirect('/login/')
模板
index.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <h3>session呼叫</h3> <span>歡迎 {{ session_user }}</span> <span>上次登入時間為 {{ session_last_time }}</span> </body> </html>
login.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action=""method="post"> {% csrf_token %} 使用者名稱 <input type="text" name="user"> 密碼 <input type="text" name="pwd"> <input type="submit"> </form> </body> </html>
可以檢視資料庫裡儲存了相關Session資訊
訪問流程
登入成功跳轉
如果直接訪問 index ,沒有儲存資訊則會跳轉會login頁面