能夠把會話理解爲客戶端與服務器之間的一次會晤,在一次會話過程當中有屢次請求和響應,可是因爲HTTP協議的特性-->無狀態,每次瀏覽器的請求都是無狀態的,沒法保存狀態信息,也就是說後臺服務器不知道當前請求是否和上一次的請求是來自同一個用戶的,試想一下,淘寶京東,沒法識別用戶並保存用戶的狀態是致命的。javascript
爲了保持鏈接狀態,便有了cookie的由來,cookie是存儲在本地服務器上的一個key-value結構的數據,相似於python中的字典,經過cookie除了能夠保存鏈接狀態,還能夠保存用戶信息等數據。java
客戶端發起請求,服務端生成cookie響應瀏覽器,這時客戶端會將cookie保存起來,當下一次訪問服務器的時候會將cookie一塊兒發送給服務器,服務器經過cookie判斷是誰的訪問
注:若是服務端發送重複的cookie,會覆蓋原有的cookiepython
Django經過一個內置中間件來實現會話功能數據庫
編輯settings.py中的MIDDLEWARE設置django
django.contrib.sessions.middleware.SessionMiddlewar
1. 數據庫Session SESSION_ENGINE = 'django.contrib.sessions.backends.db' # 引擎(默認) 而後運行 manage.py migrate 在數據庫內建立sessions表 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 set_cookie(request): obj = HttpResponse('ok') #obj=render(request,...) obj.set_cookie('name', 'ABC') # obj.set_signed_cookie(key,value,salt='加密鹽') obj.set_signed_cookie('name','lqz',salt='123')#加鹽,123是個密碼,解cookie的時候須要它, return obj
參數:瀏覽器
def get_cookie(request): print(type(request.COOKIES)) # 取cookie的值 print(request.COOKIES) name=request.COOKIES.get('name') #加鹽,123是個密碼,解cookie的時候須要它, # request.get_signed_cookie(key, default=RAISE_ERROR, salt='123', max_age=None) obj = HttpResponse('get_cookie') return obj
def logout(request): rep = redirect("/login/") rep.delete_cookie("user") # 刪除用戶瀏覽器上以前設置的usercookie值 return rep
cookie自己保存在客戶端,可能被攔截或竊取,因此網站設計一般將Cookie用來保存一些不重要的內容,實際的用戶數據和狀態仍是以Session會話的方式保存在服務器端。緩存
Session就是在服務器端的‘Cookie’,Session依賴Cookie!安全
給每一個客戶端的Cookie分配一個惟一的id,這樣用戶在訪問時,經過Cookie,服務器就知道來的人是「誰」。而後咱們再根據不一樣的Cookie的id,在服務器上保存一段時間的私密資料,如「帳號密碼」等等。
def set_session(request): # 寫session,幹了三件事(每一個瀏覽器會生成一個隨機字符串) # 隨機字符串是跟瀏覽器相關的,數據是跟帳號相關的 request.session['name']='ABC' request.session['age']='18' request.session['sex']='男' ''' 非django的步驟(django已經封裝了下面的操做) 1 生成隨機字符串:dfasfasdfa 2 去數據庫存儲 隨機字符串 值 (字典形式) 超時時間 dfasfasdfa {'name':'ABC','age':18,'sex':'男'} 超時時間 3 寫入set_cookie(set_cookie('sessionid','dfasfasdfa')) 發送給客戶端 ''' return HttpResponse('ok')
def get_session(request): # 取session 取name這個字段對應的值 name=request.session['name'] # 正常流程 非django的步驟(django已經封裝了下面的操做) # 去cookie中取出隨機字符串 # 去session那個表去查詢,取出session_data的數據,解密成字典,而後取name的值返回 # print(name)
# 刪除當前會話的全部Session數據(只刪數據庫) request.session.delete() # 刪除當前的會話數據並刪除會話的Cookie(數據庫和cookie都刪)。 request.session.flush() 這用於確保前面的會話數據不能夠再次被用戶的瀏覽器訪問 例如,django.contrib.auth.logout() 函數中就會調用它。
# 全部 鍵、值、鍵值對 request.session.keys() request.session.values() request.session.items() request.session.iterkeys() request.session.itervalues() request.session.iteritems() # 會話session的key request.session.session_key # 將全部Session失效日期小於當前日期的數據刪除 request.session.clear_expired() # 檢查會話session的key在數據庫中是否存在 request.session.exists("session_key") # 設置會話Session和Cookie的超時時間 request.session.set_expiry(value) * 若是value是個整數,session會在些秒數後失效。 * 若是value是個datatime或timedelta,session就會在這個時間後失效。 * 若是value是0,用戶關閉瀏覽器session就會失效。 * 若是value是None,session會依賴全局session失效策略。
Django默認使用JSON序列化會話數據。你能夠在SESSION_SERIALIZER
設置中自定義序列化格式,甚至寫入警告說明。可是強烈建議你仍是使用JSON,尤爲是以cookie的方式進行會話時。服務器