Django--Cookie和Session組件

什麼是Cookie:

  cookie的工作原理是:由服務端產生內容,瀏覽器收到請求之後保存在本地;當瀏覽器再次訪問的時候,瀏覽器會自動帶上這個cookie,這樣服務端就能去通過這個cookie來判斷你是誰了

 

Django中操作cookie

  獲取cookie

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)

 

  參數:

    default:默認值

    salt:加鹽

    max_age:後臺控制過去時間,單位是秒‘

 

Django中設置cookie:

rep = HttpResponse(...)
rep = render(request, ...)

rep.set_cookie(key,value,...)
rep.set_signed_cookie(key,value,salt='加密鹽', max_age=None, ...)

 

 

  參數:

    key:鍵

    value:值

    max_age:超時時間,單位是秒

    expiress:超時時間

    path:cookie的有效路徑,表示的是根路徑,特殊的:根路徑的cookie可以被任何的URL的頁面所訪問

    domain:cookie生效的域名

    secure:https傳輸

    httponly=false :只能https協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)

 

Django刪除cookie

def logout(request):
    rep = redirect("/login/")
    rep.delete_cookie("user")  # 刪除用戶瀏覽器上之前設置的usercookie值
    return rep

 

 

cookie登陸校驗

def check_login(func):
    @wraps(func)
    def inner(request, *args, **kwargs):
        next_url = request.get_full_path()
        if request.get_signed_cookie("login", salt="SSS", default=None) == "yes":
            # 已經登錄的用戶...
            return func(request, *args, **kwargs)
        else:
            # 沒有登錄的用戶,跳轉剛到登錄頁面
            return redirect("/login/?next={}".format(next_url))
    return inner


def login(request):
    if request.method == "POST":
        username = request.POST.get("username")
        passwd = request.POST.get("password")
        if username == "xxx" and passwd == "dashabi":
            next_url = request.GET.get("next")
            if next_url and next_url != "/logout/":
                response = redirect(next_url)
            else:
                response = redirect("/class_list/")
            response.set_signed_cookie("login", "yes", salt="SSS")
            return response
    return render(request, "login.html")

 

 

Django默認的session存活時間是兩週(14天)

什麼是Session

  Cookie彌補了HTTP無狀態的不足,讓服務器知道來的人是誰,但是Cookie是以文本的形式保存 在本地的, 所以自身的安全性較低;所以我們利用cookie來識別不同的用戶,對應的session裏保存私密的信息以及超過4096字節的文本,另外cookie和session其實是共通性的東西,是不僅限於語言和框架的

 

Django中設置session

  request.session['name'] = '1213William'

  1、首先生成一個隨機的字符串

  2、在Django session表中存儲該隨機字符串與數據的記錄

  3、將隨機的字符串發送給客戶端瀏覽器

 

Django中獲取session

  request.session.get('name')

  1、Django自動獲取瀏覽器隨機字符串去Django session表中進行對比

  2、如果對比成功,會將當前隨機字符串對應的數據賦值給request.session

  3、通過request.session操作該數據(數據不存在也不會影響我們的業務邏輯,應爲返回的就是None,可以進行對比)

 

在瀏覽器中會有一個鍵爲sessionid來存放session值

 

Django中刪除session數據

  request.session.delete()

 

Django中刪除當前會話數據,並刪除會話的cookie

  request.session.flush()

  這用於確保前面的會話數據不可以再次被用戶的瀏覽器訪問

 

Django中設置會話session和cookie的超時時間

  request.session.set_expiry(value)

  1、如果value是一個整數,session會在這些秒數之後失效

  2、如果value是個datatime或timedelta,session會在這個時間後才失效

  3、如果value是0,那麼用戶在關閉瀏覽器之後就會失效了

  4、如果value是None,session會依賴全局session失效策略

 

session流程的解析圖:

 

 

 

 

# 獲取、設置、刪除Session中數據
request.session['k1']
request.session.get('k1',None)
request.session['k1'] = 123
request.session.setdefault('k1',123) # 存在則不設置
del request.session['k1']


# 所有 鍵、值、鍵值對
request.session.keys()
request.session.values()
request.session.items()
request.session.iterkeys()
request.session.itervalues()
request.session.iteritems()

# 會話session的key
request.session.session_key

# 將所有Session失效日期小於當前日期的數據刪除
request.session.clear_expired()

# 檢查會話session的key在數據庫中是否存在
request.session.exists("session_key")

# 刪除當前會話的所有Session數據
request.session.delete()
  
# 刪除當前的會話數據並刪除會話的Cookie。
request.session.flush() 
    這用於確保前面的會話數據不可以再次被用戶的瀏覽器訪問
    例如,django.contrib.auth.logout() 函數中就會調用它。

# 設置會話Session和Cookie的超時時間
request.session.set_expiry(value)
    * 如果value是個整數,session會在些秒數後失效。
    * 如果value是個datatime或timedelta,session就會在這個時間後失效。
    * 如果value是0,用戶關閉瀏覽器session就會失效。
    * 如果value是None,session會依賴全局session失效策略。
session常用操作

 

 

session版的登陸驗證

from functools import wraps


def check_login(func):
    @wraps(func)
    def inner(request, *args, **kwargs):
        next_url = request.get_full_path()
        if request.session.get("user"):
            return func(request, *args, **kwargs)
        else:
            return redirect("/login/?next={}".format(next_url))
    return inner


def login(request):
    if request.method == "POST":
        user = request.POST.get("user")
        pwd = request.POST.get("pwd")

        if user == "alex" and pwd == "1213William":
            # 設置session
            request.session["user"] = user
            # 獲取跳到登陸頁面之前的URL
            next_url = request.GET.get("next")
            # 如果有,就跳轉回登陸之前的URL
            if next_url:
                return redirect(next_url)
            # 否則默認跳轉到index頁面
            else:
                return redirect("/index/")
    return render(request, "login.html")


@check_login
def logout(request):
    # 刪除所有當前請求相關的session
    request.session.delete()
    return redirect("/login/")


@check_login
def index(request):
    current_user = request.session.get("user", None)
    return render(request, "index.html", {"user": current_user})

 

 

 

Django中的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,默認修改之後才保存(默認)

 

 

 

Django中CBV添加裝飾器

  

from django.utils.decorators import method_decorator

# @method_decorator(login_auth,name='get')  # 第二種 name參數必須指定
    class MyHome(View):
        @method_decorator(login_auth)  # 第三種  get和post都會被裝飾
        def dispatch(self, request, *args, **kwargs):
            super().dispatch(request,*args,**kwargs)
        # @method_decorator(login_auth)  # 第一種
        def get(self,request):
            return HttpResponse('get')

        def post(self,request):
            return HttpResponse('post')

 

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