## 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
~~~