1. 程式人生 > >Django進階-cookie和session

Django進階-cookie和session

技術 backends spa 較高的 res 獨立 隨機字符串 end print

COOKIE

cookie的由來

由於HTTP請求是沒有狀態的

無狀態的意思是每次請求都是獨立的,它的執行情況和結果與前面的請求和之後的請求都無直接關系,它不會受前面的請求響應情況直接影響,也不會直接影響後面的請求響應情況。

狀態可以理解為客戶端和服務器在某次會話中產生的數據,那無狀態的就以為這些數據不會被保留。會話中產生的數據又是我們需要保存的,也就是說要“保持狀態”。

cookie是什麽

是服務器發送出來存儲在瀏覽器上的一組組鍵值對;下次訪問服務器時瀏覽器會自動攜帶這些鍵值對,以便服務器提取有用信息。

Django中操作cookie

設置cookie

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

rep.set_cookie
(key,value,...) rep.set_signed_cookie(key,value,salt
=加密鹽,...)
技術分享圖片
key,                 鍵
value=‘‘,             值
max_age=None,         超時時間
expires=None,         超時時間(IE requires expires, so set it if hasnt been already.)
path=/,             Cookie生效的路徑,/ 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問
domain=None,         Cookie生效的域名
secure
=False, https傳輸 httponly=False 只能http協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)
參數

獲取Cookie

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

刪除Cookie

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

SESSION

session是什麽

Cookie雖然在一定程度上解決了“保持狀態”的需求,但是由於Cookie本身最大支持4096字節,以及Cookie本身保存在客戶端,可能被攔截或竊取,因此就需要有一種新的東西,它能支持更多的字節,並且他保存在服務器,有較高的安全性。這就是Session。

django中session做的事

存session

1 在服務端生成隨機字符串(cookie)
2 生成一個和隨機字符串對應的大字典,用來保存數據
3 隨機字符串當成cookie返回給瀏覽器

取session

1 從請求攜帶的cookie中找到隨機字符串(cookie)
2 拿到隨機字符串(cookie), 在服務端找到相應的大字典(session)
3 從大字典(session)中根據key取值

常用方法

設置session

request.session[k1] = 123
request.session.setdefault(k1,123) # 存在則不設置

刪除session

request.session.delete()        # 刪除當前會話的所有Session數據
request.session.flush()         # 刪除當前會話的所有Session數據數據並刪除會話的Cookie。

查session

request.session[k1]
request.session.get(k1,None)

設置超時

request.session.set_expiry(value)    # 單位是秒

清除失效session

request.session.clear_expired()
技術分享圖片
# 獲取、設置、刪除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失效策略。
詳細方法大全 技術分享圖片
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中Session相關設置
session配置大全

將函數裝飾器變成類方法裝飾器

導入

from django.utils.decorators import method_decorator

要在CBV視圖中使用我們上面的check_login裝飾器,有以下三種方式:

加在CBV視圖的get或post方法上

from django.utils.decorators import method_decorator


class HomeView(View):

    def dispatch(self, request, *args, **kwargs):
        return super(HomeView, self).dispatch(request, *args, **kwargs)

    def get(self, request):
        return render(request, "home.html")
    
    @method_decorator(check_login)
    def post(self, request):
        print("Home View POST method...")
        return redirect("/index/")

加在dispatch方法上

from django.utils.decorators import method_decorator


class HomeView(View):

    @method_decorator(check_login)
    def dispatch(self, request, *args, **kwargs):
        return super(HomeView, self).dispatch(request, *args, **kwargs)

    def get(self, request):
        return render(request, "home.html")

    def post(self, request):
        print("Home View POST method...")
        return redirect("/index/")

直接加在視圖類上

from django.utils.decorators import method_decorator

@method_decorator(check_login, name="get")
@method_decorator(check_login, name="post")
class HomeView(View):

    def dispatch(self, request, *args, **kwargs):
        return super(HomeView, self).dispatch(request, *args, **kwargs)

    def get(self, request):
        return render(request, "home.html")

    def post(self, request):
        print("Home View POST method...")
        return redirect("/index/")

Django進階-cookie和session