cookie就是存儲在客戶端瀏覽器上的鍵值對,其實Cookie是key-value結構,相似於一個python中的字典。隨着服務器端的響應發送給客戶端瀏覽器。而後客戶端瀏覽器會把Cookie保存起來,當下一次再訪問服務器時把Cookie再發送給服務器。 Cookie是由服務器建立,而後經過響應發送給客戶端的一個鍵值對。客戶端會保存Cookie,並會標註出Cookie的來源(哪一個服務器的Cookie)。當客戶端向服務器發出請求時會把全部這個服務器Cookie包含在請求中發送給服務器,這樣服務器就能夠識別客戶端了!html
服務器產生,發給客戶端瀏覽器,瀏覽器保存起來,下次發請求,會攜帶這個鍵值對到服務器python
若是服務器端發送重複的Cookie那麼會覆蓋原有的Cookie,例如客戶端的第一個請求服務器端發送的Cookie是:Set-Cookie: a=A;第二請求服務器端發送的是:Set-Cookie: a=AA,那麼客戶端只留下一個Cookie,即:a=AA。數據庫
request.COOKIES['key'] request.get_signed_cookie(key, default=RAISE_ERROR, salt='', max_age=None)
參數:django
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
參數:瀏覽器
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中數據
#獲取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失效策略。
在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,默認修改以後才保存(默認)
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('購物')