HTTP協議是無狀態的,每次請求都是獨立的,對服務器來講,每次的請求都是全新的,上一次的訪問是數html
據是沒法保留到下一次的python
某些場景須要狀態數據或者中間數據等相關對下一次會話請求有需求的數據, 所以須要一種能夠傳遞的手段數據庫
Cookie具體爲一段小信息,由 服務器 發出存儲在 瀏覽器 上的一組組 鍵值對django
下次訪問服務器時瀏覽器會自動攜帶這些鍵值對,以便服務器提取有用信息瀏覽器
由服務器產生內容,瀏覽器收到請求後保存在本地安全
當瀏覽器再次訪問時,瀏覽器會自動帶上Cookie,這樣服務器就能經過Cookie的內容來判斷來訪者的狀態服務器
谷歌瀏覽器--右鍵檢查--Network--all--具體項目--cookiecookie
request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
參數:session
rep = HttpResponse(...) rep = render(request, ...) rep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt='加密鹽', max_age=None, ...)
參數:dom
def logout(request): rep = redirect("/login/") rep.delete_cookie("user") # 刪除用戶瀏覽器上以前設置的usercookie值 return rep
1 def check_login(func): 2 @wraps(func) 3 def inner(request, *args, **kwargs): 4 next_url = request.get_full_path() 5 if request.get_signed_cookie("login", salt="SSS", default=None) == "yes": 6 # 已經登陸的用戶... 7 return func(request, *args, **kwargs) 8 else: 9 # 沒有登陸的用戶,跳轉剛到登陸頁面 10 return redirect("/login/?next={}".format(next_url)) 11 return inner 12 13 14 def login(request): 15 if request.method == "POST": 16 username = request.POST.get("username") 17 passwd = request.POST.get("password") 18 if username == "xxx" and passwd == "dashabi": 19 next_url = request.GET.get("next") 20 if next_url and next_url != "/logout/": 21 response = redirect(next_url) 22 else: 23 response = redirect("/class_list/") 24 response.set_signed_cookie("login", "yes", salt="SSS") 25 return response 26 return render(request, "login.html") 27 28 cookie版登陸
cookie 最大支持4096字節,以及保存在客戶端本地不安全
session 將私密信息能以超過4096的限制保存在服務器,
由於html的無狀態性,爲了辨識訪問者,仍是須要基於cookie
服務器爲每一個cookie分配一個惟一id,而後在服務器端能夠爲此id保存信息
# 獲取、設置、刪除Session中數據 request.session['k1'] request.session.get('k1',None) request.session['k1'] = 123 request.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 示例
1 from functools import wraps 2 3 4 def check_login(func): 5 @wraps(func) 6 def inner(request, *args, **kwargs): 7 next_url = request.get_full_path() 8 if request.session.get("user"): 9 return func(request, *args, **kwargs) 10 else: 11 return redirect(f"/login/?next={next_url}") 12 return inner 13 14 15 def login(request): 16 if request.method == "POST": 17 user = request.POST.get("user") 18 pwd = request.POST.get("pwd") 19 20 if user == "yangtuo" and pwd == "yangtuo": 21 # 設置session 22 request.session["user"] = user 23 # 獲取跳到登錄頁面以前的URL 24 next_url = request.GET.get("next") 25 # 若是有,就跳轉回登錄以前的URL 26 if next_url: 27 return redirect(next_url) 28 # 不然默認跳轉到index頁面 29 else: 30 return redirect("/index/") 31 return render(request, "login.html") 32 33 34 @check_login 35 def logout(request): 36 # 刪除全部當前請求相關的session 37 request.session.delete() 38 return redirect("/login/") 39 40 41 @check_login 42 def index(request): 43 current_user = request.session.get("user", None) 44 return render(request, "index.html", {"user": current_user}) 45 46 Session版登陸驗證