1. 程式人生 > >Django框架 之 Cookie、Session整理補充

Django框架 之 Cookie、Session整理補充

rect() text backends response urn space 關閉 image sub

瀏覽目錄

  • Django實現的Cookie

  • Django實現的Session

一、Django實現的Cookie

1、獲取Cookie

1 2 3 4 5 6 request.COOKIES[‘key‘] request.get_signed_cookie(key, default=RAISE_ERROR, salt=‘‘, max_age=None) #參數: default: 默認值 salt: 加密鹽 max_age: 後臺控制過期時間  

2、設置Cookie

1 2 3 4 rep = HttpResponse(...) 或 rep = render(request, ...) 或 rep = redirect() rep.set_cookie(key,value,...) rep.set_signed_cookie(key,value,salt=‘加密鹽‘,...)   

參數:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 def set_cookie(self, key, 鍵              value=‘‘, 值
             max_age=None, 超長時間              expires=None, 超長時間              path=‘/‘, Cookie生效的路徑, 瀏覽器只會把cookie回傳給帶有該路徑的頁面,這樣可以避免將 cookie傳給站點中的其他的應用。 / 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面訪問
             domain=None, Cookie生效的域名 你可用這個參數來構造一個跨站cookie。 如, domain=".example.com" 所構造的cookie對下面這些站點都是可讀的: www.example.com 、 www2.example.com                          和an.other.sub.domain.example.com 。 如果該參數設置為 None ,cookie只能由設置它的站點讀取。              secure=False, 如果設置為 True ,瀏覽器將通過HTTPS來回傳cookie。              httponly=False 只能http協議傳輸,無法被JavaScript獲取 (不是絕對,底層抓包可以獲取到也可以被覆蓋)           ): pass  

由於cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。

1 2 3 <script src=‘/static/js/jquery.cookie.js‘> </script> $.cookie("key", value,{ path: ‘/‘ }); 

3、刪除Cookie

1 response.delete_cookie("cookie_key",path="/",domain=name)

cookie存儲到客戶端
優點:
數據存在在客戶端,減輕服務器端的壓力,提高網站的性能。
缺點:
安全性不高:在客戶端機很容易被查看或破解用戶會話信息  

二、Django實現的Session

1、基本操作

1 2 3 4 5 6 7 8 1、設置Sessions值 request.session[‘session_name‘] ="admin" 2、獲取Sessions值 session_name = request.session["session_name"] 3、刪除Sessions值 del request.session["session_name"] 4、檢測是否操作session值 if "session_name" is request.session :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 #其他操作 5、get(key, default=None) fav_color = request.session.get(‘fav_color‘, ‘red‘) 6、pop(key) fav_color = request.session.pop(‘fav_color‘) 7、keys() 8、items() 9、setdefault() 10、flush() 刪除當前的會話數據並刪除會話的Cookie。 這用於確保前面的會話數據不可以再次被用戶的瀏覽器訪問 例如,django.contrib.auth.logout() 函數中就會調用它。 11 用戶session的隨機字符串 request.session.session_key # 將所有Session失效日期小於當前日期的數據刪除 request.session.clear_expired() # 檢查 用戶session的隨機字符串 在數據庫中是否 request.session.exists("session_key") # 刪除當前用戶的所有Session數據 request.session.delete("session_key") request.session.set_expiry(value) * 如果value是個整數,session會在些秒數後失效。 * 如果value是個datatime或timedelta,session就會在這個時間後失效。 * 如果value是0,用戶關閉瀏覽器session就會失效。 * 如果value是None,session會依賴全局session失效策略。

2、流程解析圖

技術分享圖片

3、示例

views:

技術分享圖片 技術分享圖片
def log_in(request):

    if request.method=="POST":
        username=request.POST[‘user‘]
        password=request.POST[‘pwd‘]

        user=UserInfo.objects.filter(username=username,password=password)

        if user:
            #設置session內部的字典內容
            request.session[‘is_login‘]=‘true‘
            request.session[‘username‘]=username

            #登錄成功就將url重定向到後臺的url
            return redirect(‘/backend/‘)

    #登錄不成功或第一訪問就停留在登錄頁面
    return render(request,‘login.html‘)




def backend(request):
    print(request.session,"------cookie")
    print(request.COOKIES,‘-------session‘)
    """
    這裏必須用讀取字典的get()方法把is_login的value缺省設置為False,
    當用戶訪問backend這個url先嘗試獲取這個瀏覽器對應的session中的
    is_login的值。如果對方登錄成功的話,在login裏就已經把is_login
    的值修改為了True,反之這個值就是False的
    """

    is_login=request.session.get(‘is_login‘,False)
    #如果為真,就說明用戶是正常登陸的
    if is_login:
        #獲取字典的內容並傳入頁面文件
        cookie_content=request.COOKIES
        session_content=request.session

        username=request.session[‘username‘]

        return render(request,‘backend.html‘,locals())
    else:
        """
        如果訪問的時候沒有攜帶正確的session,
        就直接被重定向url回login頁面
        """
        return redirect(‘/login/‘)



def log_out(request):
    """
    直接通過request.session[‘is_login‘]回去返回的時候,
    如果is_login對應的value值不存在會導致程序異常。所以
    需要做異常處理
    """
    try:
        #刪除is_login對應的value值
        del request.session[‘is_login‘]
        
        # OR---->request.session.flush() # 刪除django-session表中的對應一行記錄

    except KeyError:
        pass
    #點擊註銷之後,直接重定向回登錄頁面
    return redirect(‘/login/‘)
技術分享圖片

template:

技術分享圖片 技術分享圖片
===================================login.html==================
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<form action="/login/" method="post">
    <p>用戶名: <input type="text" name="user"></p>
    <p>密碼: <input type="password" name="pwd"></p>
    <p><input type="submit"></p>
</form>


</body>
</html>


===================================backend.html==================

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<h3>hello {{ username }}</h3>
<a href="/logout/">註銷</a>

</body>
</html>
技術分享圖片

4、session存儲的相關配置

1、數據庫配置(默認)

1 2 3 4 5 6 7 8 9 10 11 12 13 14 Django默認支持Session,並且默認是將Session數據存儲在數據庫中,即:django_session 表中。 a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.db‘ # 引擎(默認) 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,默認修改之後才保存(默認)

2、緩存配置

1 2 3 4 5 6 7 8 9 10 11 12 13 14 a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.cache‘ # 引擎 SESSION_CACHE_ALIAS = ‘default‘ # 使用的緩存別名(默認內存緩存,也可以是memcache),此處別名依賴緩存的設置 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,默認修改之後才保存  

3、文件配置

1 2 3 4 5 6 7 8 9 10 11 12 a. 配置 settings.py SESSION_ENGINE = ‘django.contrib.sessions.backends.file‘ # 引擎 SESSION_FILE_PATH = None # 緩存文件路徑,如果為None,則使用tempfile模塊獲取一個臨時地址tempfile.gettempdir() 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框架 之 Cookie、Session整理補充