## cookie
cookie是存儲`key-value`對的一個文件,它是由服務器將cookie添加到response里一并返回給客戶端,然后客戶端會自動把response里的cookie接收下來,并且保存到本地,下次發出請求的時候,就會把cookie附加在request里,服務器在根據request里的cookie遍歷搜索是否有與之符合的信息。
實際上,客戶端JS中也有生成cookie的方法,需要用到插件jquery.cookie.js。
比如在瀏覽器端設置每頁顯示的條目數量
cookie不要存儲敏感信息,如密碼,余額等。
## 用法
### 設置cookie
在對象返回給客戶端之前,設置cookie
~~~
response = redirect('/page/')
response.set_cookie(key,value,...)
response.set_signed_cookie(key,value,salt='加密鹽',...)
~~~
#### 其他參數
~~~
max_age: cookie的生命長度,默認為None,瀏覽器關閉cookie立即失效
expires: cookie過期時間時間點,默認為None,瀏覽器關閉cookie立即失效
path: Cookie生效的路徑,/ 表示根路徑,根路徑的cookie可以被任何url的頁面訪問
domain: 默認值為None,設置該 Cookie 的網頁所在的域名None
secure: 用來設置 Cookie 只在確保安全的請求中才會發送。當請求是 HTTPS 或者其他安全協議時,包含 secure 選項的 Cookie 才能被保存到瀏覽器或者發送至服務器。
httponly: 只能http協議傳輸,無法被JavaScript獲取(不是絕對,底層抓包可以獲取到也可以被覆蓋)默認值False
~~~
>[info]如果同時設置了 max-age 和 expires,max-age 的時間為準
domain 和 path 兩個選項共同決定了 Cookie 何時被瀏覽器自動添加到請求頭部中發送出去
### 獲取cookie
~~~
request.COOKIES.get('key')
request.get_signed_cookie(key, salt='', max_age=None)
~~~
#### 其他參數
~~~
default: 默認值
salt: 加密鹽
max_age: 后臺控制過期時間
~~~
## 實例
### 設置每頁顯示的條目數量
由于cookie保存在客戶端的電腦上,所以,JavaScript和jquery也可以操作cookie。每次請求時,都會發送這個cookie,瀏覽器獲取這個cookie,設置每頁顯示的條目數量。
~~~
<script src='/static/js/jquery.cookie.js'></script>
$.cookie("list_pager_num", 30,{ path: '/' });
~~~
### cookie實現認證
登錄時,密碼驗證通過后,將用戶名作為cookie發送給客戶端。
~~~
response.set_cookie(username, username)
~~~
用戶訪問需要訪問認證的網頁時,驗證cookie是否存在,此處使用裝飾器。
~~~
def auth(func):
def inner(request, *args, **kwargs):
if not request.COOKIES.get(username):
return render(request, 'login.html')
return func(request, *args, **kwargs)
return inner
~~~