Django cookie
和 session
使用方法。
注意
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(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(self, key, value, salt='', **kwargs):
value = signing.get_cookie_signer(salt=key + salt).sign(value)
設置帶簽名的cookie。參數同set_cookie一樣。
get_signed_cookie(self, key, default=RAISE_ERROR, salt='', max_age=None):
獲取帶簽名的cookie。
delete_cookie(self, key, path='/', domain=None):
刪除cookie。參數同set_cookie一樣。
set_expiry(self, value):
設置session過期時間,單位秒。
get(self, key, default=None):
獲取session。
flush(self):
刪除session數據和cookie。
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")