Django cookie和session組件

什麼是cookie

cookie就是存儲在客戶端瀏覽器上的鍵值對,其實Cookie是key-value結構,相似於一個python中的字典。隨着服務器端的響應發送給客戶端瀏覽器。而後客戶端瀏覽器會把Cookie保存起來,當下一次再訪問服務器時把Cookie再發送給服務器。 Cookie是由服務器建立,而後經過響應發送給客戶端的一個鍵值對。客戶端會保存Cookie,並會標註出Cookie的來源(哪一個服務器的Cookie)。當客戶端向服務器發出請求時會把全部這個服務器Cookie包含在請求中發送給服務器,這樣服務器就能夠識別客戶端了!html

cookie原理

服務器產生,發給客戶端瀏覽器,瀏覽器保存起來,下次發請求,會攜帶這個鍵值對到服務器python

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)

參數:django

  • 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解析圖

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('購物')
相關文章
相關標籤/搜索