一 cookie 和 session
1、cookie:在網站中,http請求是無狀態的。也就是說即使第一次和服務器連接后並且登錄成功后,第二次請求服務器依然不能知道當前請求是哪個用戶。cookie
的出現就是為了解決這個問題,第一次登錄后服務器返回一些數據(cookie)給瀏覽器,然后瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie
數據自動的攜帶給服務器,服務器通過瀏覽器攜帶的數據就能判斷當前用戶是哪個了。cookie
存儲的數據量有限,不同的瀏覽器有不同的存儲大小,但一般不超過4KB。因此使用cookie
只能存儲一些小量的數據。
2、session: session和cookie的作用有點類似,都是為了存儲用戶相關的信息。不同的是,cookie
是存儲在本地瀏覽器,session
是一個思路、一個概念、一個服務器存儲授權信息的解決方案,不同的服務器,不同的框架,不同的語言有不同的實現。雖然實現不一樣,但是他們的目的都是服務器為了方便存儲數據的。session
的出現,是為了解決cookie
存儲數據不安全的問題的。
3、cookie和session使用:web
開發發展至今,cookie
和session
的使用已經出現了一些非常成熟的方案。在如今的市場或者企業里,一般有兩種存儲方式:
- 存儲在服務端:通過
cookie
存儲一個sessionid
,然后具體的數據則是保存在session
中。如果用戶已經登錄,則服務器會在cookie
中保存一個sessionid
,下次再次請求的時候,會把該sessionid
攜帶上來,服務器根據sessionid
在session
庫中獲取用戶的session
數據。就能知道該用戶到底是誰,以及之前保存的一些狀態信息。這種專業術語叫做server side session
。Django
把session
信息默認存儲到數據庫中,當然也可以存儲到其他地方,比如緩存中,文件系統中等。存儲在服務器的數據會更加的安全,不容易被竊取。但存儲在服務器也有一定的弊端,就是會占用服務器的資源,但現在服務器已經發展至今,一些session
信息還是綽綽有余的。
- 將
session
數據加密,然后存儲在cookie
中。這種專業術語叫做client side session
。flask
框架默認采用的就是這種方式,但是也可以替換成其他形式。
二 在django中操作cookie和session
2-1 操作cookie
1)設置cookie
設置cookie
是設置值給瀏覽器的。因此我們需要通過response
的對象來設置,設置cookie
可以通過response.set_cookie
來設置,這個方法的相關參數如下:
key
:這個cookie
的key
。value
:這個cookie
的value。
max_age
:最長的生命周期。單位是秒。expires
:過期時間。跟max_age
是類似的,只不過這個參數需要傳遞一個具體的日期,比如datetime
或者是符合日期格式的字符串。如果同時設置了expires
和max_age
,那么將會使用expires
的值作為過期時間。path
:對域名下哪個路徑有效。默認是對域名下所有路徑都有效。domain
:針對哪個域名有效。默認是針對主域名下都有效,如果只要針對某個子域名才有效,那么可以設置這個屬性。secure
:是否是安全的,如果設置為True
,那么只能在https
協議下才可用。httponly
:默認是False
。如果為True
,那么在客戶端不能通過JavaScript
進行操作。
2)刪除cookie
通過delete_cookie
即可刪除cookie
。實際上刪除cookie
就是將指定的cookie
的值設置為空的字符串,然后使用將他的過期時間設置為0
,也就是瀏覽器關閉后就過期
3)獲取cookie
獲取瀏覽器發送過來的cookie
信息。可以通過request.COOKIES
來或者。這個對象是一個字典類型。比如獲取所有的cookie
,那么示例代碼如下
cookies = request.COOKIES for cookie_key,cookie_value in cookies.items(): print(cookie_key,cookie_value)
4)操作cookie
django
中的session
默認情況下是存儲在服務器的數據庫中的,在表中會根據sessionid
來提取指定的session
數據,然后再把這個sessionid
放到cookie
中發送給瀏覽器存儲,瀏覽器下次在向服務器發送請求的時候會自動的把所有cookie
信息都發送給服務器,服務器再從cookie
中獲取sessionid
,然后再從數據庫中獲取session
數據。但是我們在操作session
的時候,這些細節壓根就不用管。我們只需要通過request.session
即可操作。示例代碼如下:
def index(request): request.session.get('username') return HttpResponse('index')
session
常用的方法如下:
get
:用來從session
中獲取指定值。pop
:從session
中刪除一個值。keys
:從session
中獲取所有的鍵。items
:從session
中獲取所有的值。clear
:清除當前這個用戶的session
數據。flush
:刪除session
並且刪除在瀏覽器中存儲的session_id
,一般在注銷的時候用得比較多。set_expiry(value)
:設置過期時間。
-
- 整形:代表秒數,表示多少秒后過期。
0
:代表只要瀏覽器關閉,session
就會過期。None
:會使用全局的session
配置。在settings.py
中可以設置SESSION_COOKIE_AGE
來配置全局的過期時間。默認是1209600
秒,也就是2周的時間。
8. clear_expired
:清除過期的session
。Django
並不會清除過期的session
,需要定期 手動的清理,或者是在終端,使用命令行python manage.py clearsessions
來清除 過期的session。
5)修改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。