Django(33)Django操作cookie

Silent丿丶黑羽發表於2021-05-25

前言

cookie:在網站中,http請求是無狀態的。也就是說即使第一次和伺服器連線後並且登入成功後,第二次請求伺服器依然不能知道當前請求是哪個使用者。cookie的出現就是為了解決這個問題,第一次登入後伺服器返回一些資料(cookie)給瀏覽器,然後瀏覽器儲存在本地,當該使用者傳送第二次請求的時候,就會自動的把上次請求儲存的cookie資料自動的攜帶給伺服器,伺服器通過瀏覽器攜帶的資料就能判斷當前使用者是哪個了。cookie儲存的資料量有限,不同的瀏覽器有不同的儲存大小,但一般不超過4KB。因此使用cookie只能儲存一些小量的資料。
 

django中操作cookie

 

設定cookie

設定cookie是設定值給瀏覽器的。因此我們需要通過response的物件來設定,設定cookie可以通過response.set_cookie來設定,這個方法的相關引數如下:

  1. key:這個cookie的key。
  2. value:這個cookie的value。
  3. max_age:最長的生命週期。單位是秒。
  4. expires:過期時間。跟max_age是類似的,只不過這個引數需要傳遞一個具體的日期,比如datetime或者是符合日期格式的字串。如果同時設定了expires和max_age,那麼將會使用expires的值作為過期時間。
  5. path:對域名下哪個路徑有效。預設是對域名下所有路徑都有效。
  6. domain:針對哪個域名有效。預設是針對主域名下都有效,如果只要針對某個子域名才有效,那麼可以設定這個屬性.
  7. secure:是否是安全的,如果設定為True,那麼只能在https協議下才可用。
  8. 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欄位
Django(33)Django操作cookie
我們也可以開啟網站地址上的,如下圖
Django(33)Django操作cookie
然後會出現彈出以下的視窗,點選cookie
Django(33)Django操作cookie
我們會檢視到自己剛才設定的cookieusername,且過期時間是之前設定的3分鐘
Django(33)Django操作cookie
Django(33)Django操作cookie
 

接下來我們訪問http://127.0.0.1:8000/cookie_app/get_cookie/獲取cookie,瀏覽器頁面會返回('username', 'jkc'),我們也可以開啟F12檢視請求頭的資訊,會發現請求頭中攜帶了cookie資訊,如下圖
Django(33)Django操作cookie
 

最後我們訪問http://127.0.0.1:8000/cookie_app/delete_cookie/刪除cookie,瀏覽器頁面返回刪除cookie成功,接著我們檢視網站的cookie資訊檢視會發現username的值為空,如下圖
Django(33)Django操作cookie
為什麼會設定為空?我們可以檢視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,代表過期時間就是現在,立馬就過期

相關文章