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秒鍾之后失效 這個失效指的是 cookie失效, session保存在數據庫的數據沒有失效(通過clear方法刪除數據庫數據)
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/")
# @method_decorator(check_login, name="get")
class UserInfo(views.View):
@method_decorator(check_login)
def get(self, request):
return render(request, "app02/userinfo.html")
Session的配置
1. 數據庫Session SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認) 2. 緩存Session SESSION_ENGINE = 'django.contrib.sessions.backends.cache' # 引擎 SESSION_CACHE_ALIAS = 'default' # 使用的緩存別名(默認內存緩存,也可以是memcache),此處別名依賴緩存的設置 3. 文件Session SESSION_ENGINE = 'django.contrib.sessions.backends.file' # 引擎 SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() 4. 緩存+數據庫 SESSION_ENGINE = 'django.contrib.sessions.backends.cached_db' # 引擎 5. 加密Cookie Session SESSION_ENGINE = 'django.contrib.sessions.backends.signed_cookies' # 引擎 其他公用設置項: SESSION_COOKIE_NAME = "sessionid" # Session的cookie保存在瀏覽器上時的key,即:sessionid=隨機字符串(默認) SESSION_COOKIE_PATH = "/" # Session的cookie保存的路徑(默認) SESSION_COOKIE_DOMAIN = None # Session的cookie保存的域名(默認) SESSION_COOKIE_SECURE = False # 是否Https傳輸cookie(默認) SESSION_COOKIE_HTTPONLY = True # 是否Session的cookie只支持http傳輸(默認) SESSION_COOKIE_AGE = 1209600 # Session的cookie失效日期(2周)(默認) SESSION_EXPIRE_AT_BROWSER_CLOSE = False # 是否關閉瀏覽器使得Session過期(默認) SESSION_SAVE_EVERY_REQUEST = False # 是否每次請求都保存Session,默認修改之后才保存(默認)