天天看點

Django-09-cookie和session

1. 簡介

<1> cookie不屬于http協定範圍,由于http協定無法保持狀态,但實際情況,我們卻又需要“保持狀态”,是以cookie就是在這樣一個場景下誕生。

cookie的工作原理是:由伺服器産生内容,浏覽器收到請求後儲存在本地;當浏覽器再次通路時,浏覽器會自動帶上cookie,這樣伺服器就能通過cookie的内容來判斷這個是“誰”了。

<2> cookie雖然在一定程度上解決了“保持狀态”的需求,但是由于cookie本身最大支援4096位元組,以及cookie本身儲存在用戶端,可能被攔截或竊取,是以就需要有一種新的東西,它能支援更多的位元組,并且他儲存在伺服器,有較高的安全性。這就是session。

問題來了,基于http協定的無狀态特征,伺服器根本就不知道通路者是“誰”。那麼上述的cookie就起到橋接的作用。

我們可以給每個用戶端的cookie配置設定一個唯一的id,這樣使用者在通路時,通過cookie,伺服器就知道來的人是“誰”。然後我們再根據不同的cookie的id,在伺服器上儲存一段時間的私密資料,如“賬号密碼”等等。

<3> 總結而言:cookie彌補了http無狀态的不足,讓伺服器知道來的人是“誰”;但是cookie以文本的形式儲存在本地,自身安全性較差;是以我們就通過cookie識别不同的使用者,對應的在session裡儲存私密的資訊以及超過4096位元組的文本。

<4> 另外,上述所說的cookie和session其實是共通性的東西,不限于語言和架構

2. cookie的使用

擷取cookie:request.COOKIES[key]

request.COOKIES['key']
request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
    參數:
        default: 預設值
           salt: 加密鹽
        max_age: 背景控制過期時間
           

設定cookie:response.set_cookie(key,value)

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擷取(不是絕對,底層抓包可以擷取到也可以被覆寫)
           

由于cookie儲存在用戶端的電腦上,是以,jquery也可以操作cookie。

<script src='http://830909.blog.51cto.com/static/js/jquery.cookie.js'></script>
$.cookie("list_pager_num", 30,{ path: '/' });
           

3. session的使用

擷取session:request.session[key]

設定session:reqeust.session[key] = value

删除session:del request.session[key]

(這個删除其實就是把資料庫的session_data更新為一個其他的值了,并沒有立即删除)

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,預設修改之後才儲存(預設)
 
 
b. 使用
 
    def index(request):
        # 擷取、設定、删除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的随機字元串
        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失效政策。
           
def login(request):
    print('COOKIE', request.COOKIES)
    print('SESSION', request.session)
    if request.method == "POST":
        name = request.POST.get('user')
        pwd = request.POST.get('pwd')
        if name == 'lsf' and pwd == '123456':
            # # COOKIE
            # ret = redirect('/index/')
            # ret.set_cookie('username', {'abc': 'def'}, max_age=10, expires=datetime.datetime.utcnow() + datetime.timedelta(days=3))
            # return ret

            # # SESSION
            request.session['is_login'] = True
            request.session['user'] = name
            return redirect('/index/')

    return render(request, 'login.html')


def index(request):
    # # COOKIE
    # if request.COOKIES.get('username', None):
    #     name = request.COOKIES.get('username', None)
    #     return render(request, 'index.html', locals())
    
    # SESSION
    if request.session.get('is_login', None):
        name = request.session.get('user', None)
        return render(request, 'index.html', locals())
    
    else:
        return redirect('/login/')
           

轉載于:https://www.cnblogs.com/lsf123456/p/11423729.html