前言
cookie:在網站中,http請求是無狀態的。也就是說即使第一次和服務器連接后並且登錄成功后,第二次請求服務器依然不能知道當前請求是哪個用戶。cookie
的出現就是為了解決這個問題,第一次登錄后服務器返回一些數據(cookie)
給瀏覽器,然后瀏覽器保存在本地,當該用戶發送第二次請求的時候,就會自動的把上次請求存儲的cookie
數據自動的攜帶給服務器,服務器通過瀏覽器攜帶的數據就能判斷當前用戶是哪個了。cookie
存儲的數據量有限,不同的瀏覽器有不同的存儲大小,但一般不超過4KB。因此使用cookie
只能存儲一些小量的數據。
django中操作cookie
設置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進行操作。
獲取cookie
獲取瀏覽器發送過來的cookie
信息。可以通過request.COOKIES
來或者。這個對象是一個字典類型。比如獲取所有的cookie,那么示例代碼如下:
cookies = request.COOKIES
for cookie_key,cookie_value in cookies.items():
print(cookie_key,cookie_value)
刪除cookie
通過delete_cookie
即可刪除cookie
。實際上刪除cookie
就是將指定的cookie
的值設置為空的字符串,然后使用將他的過期時間設置為0,也就是瀏覽器關閉后就過期。
實戰案例
我們先在uris.py
中寫入三個路由,一個設置cookie路由,一個獲取cookie路由,一個刪除cookie路由,代碼如下:
# 項目根路由
urlpatterns = [
path('cookie_app/', include('cookie_app.urls')),
]
# cookie_app.urls.py
urlpatterns = [
path('set_cookie/', views.set_cookie),
path('get_cookie/', views.get_cookie),
path('delete_cookie/', views.delete_cookie),
]
接着我們在views.py
視圖中寫入對應的視圖,代碼如下:
def set_cookie(request):
"""設置cookie"""
response = HttpResponse('success')
response.set_cookie('username', 'jkc', max_age=180) # 設置cookie,過期時間為180秒
return response
def get_cookie(request):
"""獲取cookie"""
cookies = request.COOKIES
return HttpResponse(cookies.items())
def delete_cookie(request):
"""刪除cookie"""
response = HttpResponse('刪除cookie成功')
response.delete_cookie('username')
return response
接下來我們訪問url地址127.0.0.1/cookie_app/set_cookie/
,打開F12
,我們可以看到網絡請求中的response header
中有set-cookie
字段
我們也可以打開網站地址上的!
,如下圖
然后會出現彈出以下的窗口,點擊cookie
我們會查看到自己剛才設置的cookieusername
,且過期時間是之前設置的3分鍾
接下來我們訪問http://127.0.0.1:8000/cookie_app/get_cookie/
獲取cookie,瀏覽器頁面會返回('username', 'jkc')
,我們也可以打開F12查看請求頭的信息,會發現請求頭中攜帶了cookie
信息,如下圖
最后我們訪問http://127.0.0.1:8000/cookie_app/delete_cookie/
刪除cookie,瀏覽器頁面返回刪除cookie成功
,接着我們查看網站的cookie
信息查看會發現username
的值為空,如下圖
為什么會設置為空?我們可以查看delete_cookie
方法的源碼,如下
def delete_cookie(self, key, path='/', domain=None):
# Most browsers ignore the Set-Cookie header if the cookie name starts
# with __Host- or __Secure- and the cookie doesn't use the secure flag.
secure = key.startswith(('__Secure-', '__Host-'))
self.set_cookie(
key, max_age=0, path=path, domain=domain, secure=secure,
expires='Thu, 01 Jan 1970 00:00:00 GMT',
)
可以看到,它里面其實是調用了set_cookie
方法,然后沒有給value
賦值,默認就為''
空字符串,然后設置max_age
為0,代表過期時間就是現在,立馬就過期