天天看點

Django cookie和session元件

什麼是cookie

cookie就是存儲在用戶端浏覽器上的鍵值對,其實Cookie是key-value結構,類似于一個python中的字典。随着伺服器端的響應發送給用戶端浏覽器。然後用戶端浏覽器會把Cookie儲存起來,當下一次再通路伺服器時把Cookie再發送給伺服器。 Cookie是由伺服器建立,然後通過響應發送給用戶端的一個鍵值對。用戶端會儲存Cookie,并會标注出Cookie的來源(哪個伺服器的Cookie)。當用戶端向伺服器送出請求時會把所有這個伺服器Cookie包含在請求中發送給伺服器,這樣伺服器就可以識别用戶端了!

cookie原理

伺服器産生,發給用戶端浏覽器,浏覽器儲存起來,下次發請求,會攜帶這個鍵值對到伺服器

Cookie的覆寫

 如果伺服器端發送重複的Cookie那麼會覆寫原有的Cookie,例如用戶端的第一個請求伺服器端發送的Cookie是:Set-Cookie: a=A;第二請求伺服器端發送的是:Set-Cookie: a=AA,那麼用戶端隻留下一個Cookie,即:a=AA。

擷取Cookie

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

參數:

  • default: 預設值
  • salt: 加密鹽
  • max_age: 背景控制過期時間

Cookie設定

obj = HttpResponse(...) 
obj = render(request, ...)
寫cookie:
        obj.set_cookie(key,value)
     return obj
删除cookie:
	obj.delete_cookie('name')
        return obj
加鹽,123是個密碼,解cookie的時候需要它,
        object.set_signed_cookie('name','lay',salt='123')
        return obj
5秒之後失效,三天失效
        object.set_cookie('name','lay',max_age=60*60*24*3)
        return obj
path
        object.set_cookie('name', 'lqz', path='/shopping/')
        return obj
           

參數:

  • key, 鍵
  • value='', 值
  • max_age=None, 逾時時間 cookie需要延續的時間(以秒為機關)如果參數是\ None`` ,這個cookie會延續到浏覽器關閉為止
  • expires=None, 逾時時間(IE requires expires, so set it if hasn't been already.)
  • path='/', Cookie生效的路徑,/ 表示根路徑,特殊的:根路徑的cookie可以被任何url的頁面通路,浏覽器隻會把cookie回傳給帶有該路徑的頁面,這樣可以避免将cookie傳給站點中的其他的應用。
  • domain=None, Cookie生效的域名 你可用這個參數來構造一個跨站cookie。如, domain=".example.com"所構造的cookie對下面這些站點都是可讀的:www.example.com 、 www2.example.com 和an.other.sub.domain.example.com 。如果該參數設定為 None ,cookie隻能由設定它的站點讀取
  • secure=False, 浏覽器将通過HTTPS來回傳cookie
  • httponly=False 隻能http協定傳輸,無法被JavaScript擷取(不是絕對,底層抓包可以擷取到也可以被覆寫)

Cookie登陸校驗

def auto_login(func):
    def inner(request,*args,**kwargs):
        is_login=request.COOKIES.get('is_login')
        url=request.get_full_path()
        print(url)
        if is_login:
            res=func(request,*args,**kwargs)
            return res
        else:
            return redirect('/login/?returnurl=%s'%url)
    return inner

def login(request):
    if request.method=='GET':
        return render(request,'login.html')
    else:
        returnurl=request.GET.get('returnurl')
        name=request.POST.get('name')
        pwd=request.POST.get('pwd')
        if name=='lll' and pwd=='123':
            if returnurl:
                obj=redirect(returnurl)
            else:
                obj=redirect('/login/')
            obj.set_cookie('is_login',True)
            return obj
        return HttpResponse('賬号密碼錯誤')

@auto_login
def order(request):
    return HttpResponse('訂單')
           

 session介紹

  • 解決cookie不安全的問題,
  • 存在伺服器上的鍵值對{'随機字元串':{name:lll,pwd:123}}
  • 用session必須跟cookie連用

session解析圖

Django cookie和session元件

session使用方法

# 擷取、設定、删除Session中資料
#擷取session中鍵為k1的值
request.session['k1']
request.session.get('k1',None)
#設定session中鍵為k1值為123
request.session['k1'] = 123
  '''設定内部機制
     1 生成随機字元串:dfasfasdfa
    2 去資料庫存儲
        随機字元串     值  (字典形式)                      逾時時間
     dfasfasdfa {'name':'lqz','age':18,'sex':'男'} 逾時時間
    3 寫入scookie(set_cookie('sessionid','dfasfasdfa'))
 '''

request.session.setdefault('k1',123) # 存在則不設定
#删除session資料
del request.session['k1']

name=request.session['name']
  # 正常流程
  # 去cookie中取出随機字元串
  # 取session那個表去查詢,取出session_data的資料,解密成字典,然後取name的值


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

# 會話session的key
request.session.session_key
  #内部執行 request.COOKIES.get('sessionid') 拿到sessionid

# 将所有Session失效日期小于目前日期的資料删除
request.session.clear_expired()

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

# 删除目前會話的所有Session資料(隻删資料庫)
request.session.delete()
  
# 删除目前的會話資料并删除會話的Cookie(資料庫和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配置

在django的settings檔案内配置

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,預設修改之後才儲存(預設)
           

 session登陸檢驗

def auto_login(func):
    def inner(request, *args, **kwargs):
        nexturl = request.get_full_path()
        if request.session.get('is_login'):
            res = func(request, *args, **kwargs)
            return res
        else:
            return redirect('/login/?nexturl=%s' % nexturl)
    return inner

def login(request):
    if request.method == 'GET':
        return render(request, 'login.html')
    else:
        nexturl = request.GET.get('nexturl')
        name = request.POST.get('name')
        pwd = request.POST.get('pwd')
        if name == 'lay' and pwd == '123':
            if nexturl:
                obj = redirect(nexturl)
            else:
                obj = redirect('/login/')
            request.session['is_login'] = True
            request.session['name'] = name
            request.session['pwd'] = pwd
            return obj
        return HttpResponse('錯誤')

@auto_login
def order(request):
    return HttpResponse('訂單')

@auto_login
def shop(request):
    return HttpResponse('購物')
           

轉載于:https://www.cnblogs.com/layerluo/p/10004081.html