http請求無狀態:
所謂http是無狀態協議,言外之意是說http協議無法保存客戶機信息,也就無法區分每次請求的不一樣之處。python
保持http狀態的技術cookie和session:web
cookie:數據庫
cookie:cookie的出現就是爲了解決http請求無狀態的問題,第一次登陸後服務器返回一些數據(cookie)給瀏覽器,而後瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie數據自動的攜帶給服務器,服務器經過瀏覽器攜帶的數據進行一些自定義的操做就能判斷當前用戶是哪一個了。可是cookie機制也是有缺陷的,首先cookie存儲的數據量有限,不一樣的瀏覽器有不一樣的存儲大小,但通常不超過4KB,其次,cookie存儲的是明文信息,這樣可能會形成一些安全隱患。爲了彌補cookie的這些缺陷,session應運而生。django
session:
session和cookie的做用有點相似,都是爲了存儲用戶相關的信息。不一樣的是,cookie是存儲在本地瀏覽器,而session則是一個思路、一個概念、一個服務器存儲受權信息的解決方案,不一樣的服務器,不一樣的框架,不一樣的語言有不一樣的實現。雖然實現不同,可是他們的目的都是爲了服務器更方便存儲數據的。與此同時,session的出現,解決了cookie存儲數據不安全的問題的。flask
cookie和session聯合使用:瀏覽器
web開發發展至今,cookie和session的使用已經出現了一些很是成熟的方案。session通常有兩種存儲方式:
一、存儲在服務端:經過cookie存儲一個sessionid,而後具體的數據則是保存在session中。若是用戶已經登陸,則服務器會在cookie中保存一個sessionid,下次再次請求的時候,會把該sessionid攜帶上來,服務器根據sessionid在session庫中獲取用戶的session數據。就能知道該用戶究竟是誰,以及以前保存的一些狀態信息。這種專業術語叫作server side session。Django中session的存儲就是這種機制,信息默認存儲到數據庫中(自動生成的django_session表),固然也能夠存儲到其餘地方,好比緩存中,文件系統中等。存儲在服務器的數據會更加的安全,不容易被竊取。但存儲在服務器也有必定的弊端,就是會佔用服務器的資源,但如今服務器已經發展至今,一些session信息仍是綽綽有餘的。
二、將session數據加密,而後存儲在客戶端cookie中。這種專業術語叫作client side session。flask框架默認採用的就是這種方式,可是也能夠替換成其餘形式緩存
django中操做cookie:安全
設置cookie:
cookie是設置值給瀏覽器用來保存的,所以咱們須要經過response的對象來設置,設置cookie能夠經過response.set_cookie來設置,set_cookie方法在使用時傳遞的相關參數以下:服務器
key:這個cookie的key。
value:這個cookie的value。
max_age:最長的生命週期。單位是秒。
expires:過時時間。跟max_age是相似的,只不過這個參數須要傳遞一個具體的日期,好比datetime或者是符合日期格式的字符串。若是同時設置了expires和max_age,那麼將會使用expires的值做爲過時時間,若是expires和max_age都未設置,那麼過時時間就是瀏覽器關閉時,若是設置的expire時間比當前時間還小,那麼cookie的過時時間就是設置時間,即設置即過時。
path:對域名下哪一個路徑有效。默認是對域名下全部路徑都有效。
domain:針對哪一個域名有效。默認是針對主域名下都有效,若是隻要針對某個子域名纔有效,那麼能夠設置這個屬性.
secure:是不是安全的,若是設置爲True,那麼只能在https協議下才可用。
httponly:默認是False。若是爲True,那麼在客戶端不能經過JavaScript進行操做。cookie
刪除cookie:
cookie的刪除也是在瀏覽器上刪除,因此也是經過response對象進行刪除。刪除時只要調用delete_cookie方法便可,delete_cookie方法其實內部也是調用set_cookie方法,把max_age參數設置爲0,即當即失效,delete_cookie的源碼以下:
def delete_cookie(self, key, path='/', domain=None):
self.set_cookie(key, max_age=0, path=path, domain=domain, expires='Thu, 01-Jan-1970 00:00:00 GMT')
參數解析:
key:cookie設置時的key
path:cookie設置時的path,默認爲'/',若是想要刪除一個再設置時傳遞了path參數的cookie,那麼這個參數必需要和設置時如出一轍,不然將沒法刪除
domain:與path同樣理解便可
操做session:
django中的session默認狀況下是存儲在服務器的數據庫中的,若是使用默認的存儲機制,首先須要執行python manage.py migrate命令把遷移腳本文件映射到數據庫,session存儲的表默認爲django_session表,在表中會根據sessionid來提取指定的session數據,而後再把這個sessionid放到cookie中發送給瀏覽器存儲,瀏覽器下次在向服務器發送請求的時候會自動的把全部cookie信息都發送給服務器,服務器再從cookie中獲取sessionid,而後再從數據庫中獲取session數據。可是咱們在操做session的時候,這些細節壓根就不用管。咱們只須要經過request.session便可操做。
session經常使用的方法以下:
get:用來從session中獲取指定值。
pop:從session中刪除一個值,並將其返回,在使用時最好加上try語句,由於若是pop不存在的值,會報錯。
keys:從session中獲取全部的鍵。
items:從session中獲取全部的值。
clear:清除當前這個用戶的session數據。
flush:刪除session而且刪除在瀏覽器中存儲的session_id,通常在註銷的時候用得比較多。
set_expiry(value):設置過時時間。
整形:表明秒數,表示多少秒後過時。
0:表明只要瀏覽器關閉,session就會過時。
None:會使用全局的session配置。在settings.py中能夠設置SESSION_COOKIE_AGE來配置全局的過時時間。默認是1209600秒,也就是2周的時間。
clear_expired:清除過時的session。Django並不會清除過時的session,須要按期手動的清理,或者是在終端,使用命令行python manage.py clearsessions來清除過時的session。
修改django中session的存儲機制:
默認狀況下,session數據是存儲到數據庫中的。固然也能夠將session數據存儲到其餘地方。能夠經過設置SESSION_ENGINE來更改session的存儲位置,這個能夠配置爲如下幾種方案:
一、django.contrib.sessions.backends.db:使用數據庫。默認就是這種方案。
二、django.contrib.sessions.backends.file:使用文件來存儲session。
三、django.contrib.sessions.backends.cache:使用緩存來存儲session。想要將數據存儲到緩存中,前提是你必需要在settings.py中配置好CACHES,而且是須要使用Memcached,而不能使用純內存做爲緩存。
四、django.contrib.sessions.backends.cached_db:在存儲數據的時候,會將數據先存到緩存中,再存到數據庫中。這樣就能夠保證萬一緩存系統出現問題,session數據也不會丟失。在獲取數據的時候,會先從緩存中獲取,若是緩存中沒有,那麼就會從數據庫中獲取。
五、django.contrib.sessions.backends.signed_cookies:將session信息加密後存儲到瀏覽器的cookie中。這種方式要注意安全,建議設置SESSION_COOKIE_HTTPONLY=True,那麼在瀏覽器中不能經過js來操做session數據,而且還須要對settings.py中的SECRET_KEY進行保密,由於一旦別人知道這個SECRET_KEY,那麼就能夠進行解密。另外還有就是在cookie中,存儲的數據不能超過4k。