1. 程式人生 > >Django 中的 cookie 和 session

Django 中的 cookie 和 session

失效 timedelta xxxxxxxx 鍵值 efs 數據庫 for requires backends

一、cookie

由於HTTP協議是無狀態的,而服務器端的業務必須是要有狀態的。Cookie誕生的最初目的是為了存儲web中的狀態信息,以方便服務器端使用。比如判斷用戶是否是第一次訪問網站。目前最新的規範是RFC 6265,它是一個由瀏覽器服務器共同協作實現的規範。

Cookie的處理分為:

服務器像客戶端發送cookie

瀏覽器將cookie保存

之後每次http請求瀏覽器都會將cookie發送給服務器端

  • 簡單的來說,cookie就是服務端給瀏覽器的一些鍵值對(key - value)

    瀏覽器會按照規則保存下 cookie,並在後面的請求中把這些 key-value一並發送給服務端
    服務端拿到辨別是誰給我發的請求,是否經過認證之類
1.2 Django中操作cookie
  1. Django中設置cookie:

    ?
    from django.shortcuts import render, HttpResponse, redirect
    ?
    #創建一個要返回給前端的對象
    response = HttpResponse("<center>404 你錯了!</center>")
    ?
    #基於response 來設置 cookie
    response.set_cookie(key="name", value="zhanSan") #這樣一個帶默認約束的cookie就設置好了

    ?
    #設置一個帶超時時間的cookie 參數 max_age (expire) 表示多少秒後過期
    response.set_cookie("email", "[email protected]", max_age=60)
    ?
    #設置一個加密(加鹽)的cookie
    response.set_signed_cookie("uid", 17, salt="for_uid")
    ?
    #大功告成,直接給客戶端返回就行
    return response

  2. Django 在 request 對象中封裝了所有來自客戶端的數據

    所以:我們獲取cookie就是基於request對象來操作

    ?
    request.COOKIES.get("name", None)
    ?
    #獲取那個加了鹽的 key = uid 的值,需要根據加的鹽反解
    request.get_signed_cookie("uid", salt="for_uid")
    ?

    這兒的cookies 都是以字典形式在維護的,所以不建議通過request.COOKIES["name"]去取,

    當key不存在時就報錯了

1.2 續 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 hasn't been already.)
        path='/',         Cookie生效的路徑,/ 表示根路徑,特殊的:跟路徑的cookie可以被任何url的頁面訪問
        domain=None,      Cookie生效的域名
        secure=False,     https傳輸
        httponly=False    只能http協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)

?
二、session

  • session與cookie區別:

  1. cookie保存在客戶端,session保存在服務端

  2. cookie的保存形式為key-value, session的保存形式為 key : {k1: v1, k2:v2, k3: v3}

  3. session的第一個key為服務端生成的字符串,會以cookie的形式發送給客戶端
    默認發送(瀏覽器保存)形式為:sessionid="隨機字符串"
    服務器的保存形式為:"隨機字符串": {k1:v1, k2: v2, k3:v3}

  4. Django 中的session也是維護在 request參數中的,COOKIES也是

2.2 Django操作session
  • Django在生成session非常的方便,默認自動給你生成、維護 session的識別(隨機字符串)

    不需要你去手動生成維護這個字符串及對應的字典。只需要去設置需要存儲的值就行了
  1. 生成並設置session:
    request.session[‘user‘] = "zhangSan"
    request.session[‘email‘] = "[email protected]"
    request.session[‘pwd‘] = "xxxxxxxx"

  2. 設置session超時時間:
    request.session.set_expiry(60) #超時時間設置為60秒

  3. 退出時清除設置的session:
    request.session.clear()

因為sesson內部是一個字典,所以字典的方法都可以使用

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

  • 一些常用的session方法:

    # 用戶session的隨機字符串
    request.session.session_key
    ?
    # 將所有Session失效日期小於當前日期的數據刪除
    request.session.clear_expired()
    ?
    # 檢查 用戶session的隨機字符串 在數據庫中是否
    request.session.exists("session_key")
    ?
    # 刪除當前用戶的所有Session數據
    request.session.delete("session_key")
    ?
    request.session.delete(request.session.session_key)
    ?
    request.session.set_expiry(value)
    * value整數,session在value秒後失效。
    * value是datatime或timedelta,session會在設定時間後失效。
    * value=0,用戶關閉瀏覽器session就會失效。
    * value是None,session會依賴全局session失效策略。

?
2.3 配置session全局設置

  • 項目木同名的settings.py下:
  1. 存儲引擎:
    # cache中:
    SESSION_ENGINE = "django.contrib.sessions.backends.cache"
    SESSION_ALIAS = "db2" #別名緩存位置,指定存儲庫。默認內存緩存,也可以是memcache
    #數據庫中
    SESSION_ENGINE = "django.contrib.sessions.backends.db"
    #文件中:
    SESSION_ENGINE = "django.contrib.sessions.backends.file"
    SESSION_FILE_PATH = None #文件路徑
    #緩存加DB
    SESSION_ENGINE = ‘django.contrib.sessions.backends.cached_db‘

  2. 常用設置:

    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,默認修改之後才保存

三、JS操作cookie

獲取項目所有cookie

document.cookie

document.cookie
"__gads=ID=3694xxxa751ed:T=1511442057:S=ALNI_MZTRxxxxNqKryxxxxZu7kjFQ; _ga=GA1.2.1165121507991355; __utma=226521935.11149926.15015647545.1531209676.1531270605.3; __utmz=2265156451270605.3.2.utmcsr=zzk.cnblogs.c587445ccn=(referral)|utmcmd=referral|sdfecct=/s/blogpost; AlwaysCresdfesAsActive=True; AdminCoosfesdfsExpandAdvanced=True; SERVERID=a15b3bd10716efwefsdfbb89e87a05|1536885192|1535456884623"

可以看見全部存在一個字符串中了:那想匹配誰就用正則策略去匹配吧!
都是 key=value; 然後以分號結尾

var cookie_str = document.cookie
var pattern = /你要匹配的key=([.|_a-zA-Z0-9]+:) \b/
pattern.exec(cookie_str)
3.2 給cookie設置超時時間

匹配部分我使用的jquery.cookie.js插件,你也可以使用原生JavaScript

function expire_session(name, time){
    var date_time = new Date();
    date_time.setTime(date_time.getTime()+time);
    var expires= "expires="+ date_time.toGMTString()+";path=/";
    document.cookie = name+"="+$.cookie(name)+';'+expires;
}

Django 中的 cookie 和 session