Django `cookie` 和 `session`使用方法。

Django cookiesession使用方法。
注意

  • cookie使用 response 設置, 因爲cookie存儲在瀏覽器端。
  • session使用 request 設置, 因爲session存儲在服務端端。

SESSION_SAVE_EVERY_REQUEST = Ture
當在settings.py中設置時,每次請求都會刷新Session·超時時間。意思就是,
當設置超時10秒時,只要10秒之內再請求一次,就會重新10秒倒計時。

公共方法

屬性 示例代碼
set_cookie
設置cookie。
set_signed_cookie
設置帶簽名的cookie。
get_signed_cookie
獲取帶簽名的cookie。
delete_cookie
刪除cookie。
session.set_expiry
設置session過期時間,單位秒。
session.get
獲取session。
session.flush
刪除session數據和cookie。
clear_expired
將所有session過期日期的數據,從數據庫中刪除。

詳細信息
set_cookie

set_cookie(self, key, value='', max_age=None, expires=None, path='/',
                   domain=None, secure=False, httponly=False, samesite=None):

設置cookie。

參數
max_age
設置過期時間,單位秒
path
Cookie生效的路徑,/ 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問。
domain
Cookie生效的域名。

set_signed_cookie

set_signed_cookie(self, key, value, salt='', **kwargs):
        value = signing.get_cookie_signer(salt=key + salt).sign(value)

設置帶簽名的cookie。參數同set_cookie一樣。

get_signed_cookie

get_signed_cookie(self, key, default=RAISE_ERROR, salt='', max_age=None):

獲取帶簽名的cookie。

delete_cookie

delete_cookie(self, key, path='/', domain=None):

刪除cookie。參數同set_cookie一樣。

session.set_expiry

set_expiry(self, value):

設置session過期時間,單位秒。

session.get

get(self, key, default=None):

獲取session。

session.flush

flush(self):

刪除session數據和cookie。

session.clear_expired

clear_expired(cls):

將所有session過期日期的數據,從數據庫中刪除。

本章示例
cookie 示例

from django.shortcuts import render, redirect
from functools import wraps


def check_login(func):
    @wraps(func)  # 裝飾器修復技術
    def inner(request, *args, **kwargs):
        ret = request.get_signed_cookie("is_login", default="0", salt="s10nb")
        if ret == "1":
            # 已經登陸過的 繼續執行
            return func(request, *args, **kwargs)
        # 沒有登錄過的 跳轉到登錄頁面
        else:
            # 獲取當前訪問的URL
            next_url = request.path_info
            print(next_url)
            return redirect("/login/?next={}".format(next_url))

    return inner


def login(request):
    print(request.get_full_path())  # 獲取當前請求的路徑和參數
    print(request.path_info)  # 取當前請求的路徑
    print("-" * 120)

    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        # 從URL裏面取到 next 參數
        next_url = request.GET.get("next")

        if user == "alex" and pwd == "dsb":
            # 登陸成功
            # 告訴瀏覽器保存一個鍵值對

            if next_url:
                rep = redirect(next_url)  # 得到一個響應對象
            else:
                rep = redirect("/home/")  # 得到一個響應對象

            # rep.set_cookie("is_login", "1")
            # 設置加鹽的cookie
            rep.set_signed_cookie("is_login", "1", salt="s10nb", max_age=10)  # 單位是秒
            return rep

    return render(request, "login.html")


def home(request):
    # 從請求的cookie中找 有沒有 xiaohei
    # ret = request.COOKIES.get("is_login", 0)
    # 取加鹽過的
    ret = request.get_signed_cookie("is_login", default="0", salt="s10nb")
    print(ret, type(ret))
    if ret == "1":
        # 表示已經登陸過
        return render(request, "home.html")
    else:
        return redirect("/login/")


@check_login
def index(request):
    return render(request, "index.html")


# 註銷函數
def logout(request):
    # 如何刪除Cookie
    rep = redirect("/login/")
    rep.delete_cookie("is_login")
    return rep

session 示例

from django.shortcuts import render, redirect
from django import views

# Create your views here.
from functools import wraps
# Django提供的工具,把函數裝飾器轉變成方法裝飾器
from django.utils.decorators import method_decorator
from django.views.decorators.csrf import csrf_exempt, csrf_protect


def check_login(func):
    @wraps(func)  # 裝飾器修復
    def inner(request, *args, **kwargs):
        ret = request.session.get("is_login")
        # 1. 獲取cookie中的隨機字符串
        # 2. 根據隨機字符串去數據庫取 session_data --> 解密 --> 反序列化成字典
        # 3. 在字典裏面 根據 is_login 取具體的數據
        if ret == "1":
            # 已經登陸過的 繼續執行
            return func(request, *args, **kwargs)
        # 沒有登錄過的 跳轉到登錄頁面
        else:
            # 獲取當前訪問的URL
            next_url = request.path_info
            print(next_url)
            return redirect("/app02/login/?next={}".format(next_url))
    return inner


@csrf_exempt
def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")
        # 從URL裏面取到 next 參數
        next_url = request.GET.get("next")

        if user == "alex" and pwd == "dsb":
            # 登陸成功
            # 告訴瀏覽器保存一個鍵值對
            if next_url:
                rep = redirect(next_url)  # 得到一個響應對象
            else:
                rep = redirect("/app02/home/")  # 得到一個響應對象
            # 設置session
            request.session["is_login"] = "1"
            request.session["name"] = user
            request.session.set_expiry(7)  # 7秒鐘之後失效
            return rep

    return render(request, "app02/login.html")


@check_login
def home(request):
    user = request.session.get("name")
    return render(request, "app02/home.html", {"user": user})


@check_login
def index(request):
    return render(request, "app02/index.html")


# 註銷函數
def logout(request):
    # 只刪除session數據
    # request.session.delete()
    # 如何刪除session數據和cookie
    request.session.flush()
    return redirect("/app02/login/")

class UserInfo(views.View):

    @method_decorator(check_login)
    def get(self, request):
        return render(request, "app02/userinfo.html")

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章