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秒鍾之后失效 這個失效指的是 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,默認修改之后才保存(默認)

  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM