Django基礎之cookie
阿新 • • 發佈:2018-11-22
sign 查看cookie path home 方法 pan 存在 urn .get
1. Cookie
1.1 Cookie的由來
大家都知道HTTP協議是無狀態的。無狀態的意思是每次請求都是獨立的,它的執行情況和結果與前面的請求和之後的請求都無直接關系, 它不會受前面的請求響應情況直接影響, 也不會直接影響後面的請求響應情況。
一句話來概括, 對於服務器來說, 每次的請求都是全新的。
狀態可以理解為客戶端和服務器在每次會話中產生的數據, 那無狀態的就以為這些數據不會被保留. 會話中產生的數據又是我們需要保存的, 也就是說要"保持狀態". 因此Cookie就是在這樣一個場景下誕生。
1.2 什麽是Cookie
Cookie具體指的是一段小信息, 它是服務器發送出來存儲在瀏覽器上的一組組鍵值對, 下次訪問服務器時瀏覽器會自動攜帶這些鍵值對, 以便服務器提取有用的信息。
1.3 Cookie的原理
cookie的工作原理是: 由服務器產生內容, 瀏覽器收到請求後保存在本地; 當瀏覽器再次訪問時, 瀏覽器會自動帶上Cookie, 這樣服務器就能通過Cookie的內容來判斷這個是"誰"了。
1.4 查看Cookie
我們使用Chrome瀏覽器, 打開開發者工具.。
2. Django中操作Cookie
2.1 獲取cookie
request.COOKIES["key"] request.get_signed_cookie("key", default=RAISE_ERROR, s, max_age=None)
get_signed_cookie方法的參數:
- default默認值
- salt: 加密鹽
- max_age: 後臺控制過期時間
2.2 設置Cookie
rep = HttpResponse(...) rep = render(request, ...) rep.set_cookie(key, value, ...) rep.set_signed_cookie(key, value, salt="加密鹽", ...)
參數:
key 鍵 value="" 值 max_age=None 超時時間 expires=None 超時時間(IE requires expores, so set it if hasn‘t been already) path="/" cookie生效的路徑, /表示根路徑, 特殊的: 根路徑的cookie可以被任何url的頁面訪問 domain=None Cookie生效的域名 secure=False https傳輸 httponly=False 只能http協議傳輸, 無法被JavaScript獲取(不是絕對, 底層抓包可以獲取到也可以被覆蓋)
2.3 刪除cookie
def logout(request): rep = redirect("/login/") rep.delete_cookie
3. Cookie版登錄校驗
from django.shortcuts import render, redirect, HttpResponse def login_required(func): def inner(request, *args, **kwargs): return_url = request.path_info print(return_url) if request.COOKIES.get("is_login") == "True": print("cookies true") ret = func(request, *args, **kwargs) return ret else: return redirect("/login/?ReturnUrl={}".format(return_url)) return inner def login(request): err_msg = "" if request.method == "POST": username = request.POST.get("username") password = request.POST.get("password") print(username, password) if username == "yang" and password == "123": return_url = request.GET.get("ReturnUrl", "") if return_url: ret = redirect(return_url) else: ret = redirect("/index/") ret.set_cookie("is_login", "True", max_age=604800) return ret else: err_msg = "用戶名或者密碼錯誤" return render(request, "login.html", {"err_msg": err_msg}) @login_required def index(request): return render(request, "index.html") @login_required def home(request): return HttpResponse("這是home頁面") @login_required def logout(request): rep = redirect("/login/") rep.delete_cookie("is_login") return rep
Django基礎之cookie