1. 程式人生 > >Django基礎之cookie

Django基礎之cookie

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