django
cookie
cookie 是什麼
儲存在瀏覽器端的鍵值對,讓伺服器提取有用的資訊。
為什麼要有 cookie
因為http請求是無狀態的。
無狀態的意思是每次請求都是獨立的,它的執**況和結果與前面的請求和之後的請求都無直接關係,它不會受前面的請求響應情況直接影響,也不會直接影響後面的請求響應情況。
狀態可以理解為客戶端和伺服器在某次會話中產生的資料,那無狀態的就以為這些資料不會被保留。會話中產生的資料又是我們需要儲存的,也就是說要「保持狀態」。因此cookie就是在這樣乙個場景下誕生。
cookie 的原理
服務端可以在返回響應的時候 做手腳
在瀏覽器上寫入鍵值對(cookie)
瀏覽器傳送請求的時候會自動攜帶該**儲存在我瀏覽器的鍵值對(cookie)
chrome 上檢視 cookie
檢視cookie
設定 cookie
只有響應物件才能設定 cookie
# 響應物件
# 不加密方式設定cookie
rep.set_cookie(key,value,...)
# 加密方式設定cookie
rep.set_signed_cookie(key,value,salt='加密鹽',...)
引數獲取 cookie
不加密的 cookie 獲取:
request.cookies['key']
request.cookies.get('key')
加密的 cookie 獲取
request.get_signed_cookie(key, default=raise_error, salt='', max_age=none)
引數:刪除 cookie
刪除 cookie 操作大多是在登出時用的,也是通過響應物件刪除。
def
logout
(request):
# 刪除cookie,操作的是響應物件,最後需要返回
rep.delete_cookie("is_login")
return rep
cookie 版登入**
from django.shortcuts import render, redirect
# 匯入用於裝飾器修復技術的包
from functools import wraps
# create your views here.
# 裝飾器函式,用來判斷是否登入
defcheck_login
(func):
@wraps(func) # 裝飾器修復技術
definner
(request, *args, **kwargs):
ret = request.get_signed_cookie("is_login", default="0", salt="ban")
if ret == "1":
# 已經登入,繼續執行
return func(request, *args, **kwargs)
# 沒有登入過
else:
# ** 即使登入成功也只能跳轉到home頁面,現在通過在url中加上next指定跳轉的頁面
# 獲取當前訪問的url
next_url = request.path_info
return inner
deflogin
(request):
if request.method == "post":
username = request.post.get("username")
pwd = request.post.get("pwd")
next_url = request.get.get("next")
if username == "alex"
and pwd == "dsb":
# return redirect("/home/")
# 伺服器返回的響應物件
# 通過url中的next引數指定跳轉的頁面,如果為空,預設跳轉到home頁面
if next_url:
rep = redirect(next_url)
else:
print("ban")
# 1. 設定cookie
# rep.set_cookie("is_login", "1")
# 2. 設定加鹽cookie,max_age是cookie的生存時間
rep.set_signed_cookie("is_login", "1", salt="ban", max_age=100)
return rep
defhome
(request):
# 獲取cookie並判斷
# if request.cookies.get("is_login", 0) == "1":
# 獲取加鹽cookie並判斷
ret = request.get_signed_cookie("is_login", default="0", salt="ban")
if ret == "1":
else:
# 登出函式
deflogout
(request):
# 刪除cookie,操作的是響應物件,最後需要返回
rep.delete_cookie("is_login")
return rep
@check_login
defindex
(request):
參考:
Django中cookie的使用
0 會話跟蹤,會話保持 1 cookie規範 cookie大小上限為4kb 乙個伺服器最多在客戶端瀏覽器上儲存20個cookie 乙個瀏覽器最多儲存300個cookie 2 django中操作cookie 增 obj.set cookie key value 刪 obj.delete cookie ...
Django中GROUP CONCAT的實現
最近專案中前端向django後端請求使用者資訊列表,其中涉及到兩個manytomany的field拼接,想到了用group concat實現。期初採用了extra的方案,但因為涉及到sql語句的直接編寫,通用性不強,且感覺有點low 因此希望用django 的orm實現。參考了hj009zzh的下面...
django之基於cookie和裝飾器實現使用者認證
示例1 1 create your views here.2 user a 3 pwd a 4def login request 5if request.method get 6 return render request,login.html 7elif request.method post 8...