Django Cookie,Session

Cookie

Cookie的由來

  HTTP協議是無狀態的,每次請求都是獨立的,對服務器來講,每次的請求都是全新的,上一次的訪問是數html

據是沒法保留到下一次的python

  某些場景須要狀態數據或者中間數據等相關對下一次會話請求有需求的數據, 所以須要一種能夠傳遞的手段數據庫

Cookie的本質

  Cookie具體爲一段小信息,由 服務器 發出存儲在 瀏覽器 上的一組組 鍵值對django

  下次訪問服務器時瀏覽器會自動攜帶這些鍵值對,以便服務器提取有用信息瀏覽器

Cookie的原理

   由服務器產生內容,瀏覽器收到請求後保存在本地安全

  當瀏覽器再次訪問時,瀏覽器會自動帶上Cookie,這樣服務器就能經過Cookie的內容來判斷來訪者的狀態服務器

查看Cookie   

  谷歌瀏覽器--右鍵檢查--Network--all--具體項目--cookiecookie

Django中操做Cookie

獲取Cookie

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

參數:session

  • default  :      默認值
  • salt  :           加密鹽
  • max_age  :    後臺控制過時時間 (不設置默認cookie 關閉瀏覽器就失效)

設置Cookie

rep = HttpResponse(...)
rep = render(request, ...)

rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密鹽', max_age=None, ...)

參數:dom

  •   key,                  鍵
  •   value='',           值
  •   max_age=None,        超時時間
  •   expires=None,           超時時間(IE requires expires, so set it if hasn't been already.)
  •   path='/', Cookie生效的路徑,             / 表示根路徑,特殊的:根路徑的cookie能夠被任何url的頁面訪問
  •   domain=None,                                   Cookie生效的域名
  •   secure=False,                                  https傳輸
  •   httponly=False                                 只能http協議傳輸,沒法被JavaScript獲取(不是絕對,底層抓包能夠獲取到也能夠被覆蓋)

刪除Cookie

def logout(request):
  rep = redirect("/login/")
  rep.delete_cookie("user") # 刪除用戶瀏覽器上以前設置的usercookie值
  return rep

cookie 示例

 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版登陸
View Code

Session

Session的由來

  cookie   最大支持4096字節,以及保存在客戶端本地不安全

  session 將私密信息能以超過4096的限制保存在服務器,

Session的工做原理

  由於html的無狀態性,爲了辨識訪問者,仍是須要基於cookie

  服務器爲每一個cookie分配一個惟一id,而後在服務器端能夠爲此id保存信息

Django 中的 Session的相關方法

# 獲取、設置、刪除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版登陸驗證
View Code
相關文章
相關標籤/搜索