Django中的Cookie 實現登入

2022-06-22 05:30:15 字數 3196 閱讀 5020

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...