本篇介绍Django的Cookie和Session。
Cookie
基本概念
定义
- Cookie指的是一小段信息,它是保存在浏览器的一组组键值对 key:value 。
原理
cookie的工作原理是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上Cookie,这样服务器就能通过Cookie的内容来判断这个是“谁”了。
特性
服务器让浏览器进行设置,浏览器也有权不设置
保存在浏览器本地
下次访问时自动携带对应的cookie
用途
- 因为HTTP协议是无状态的,即服务器不知道用户上一次做了什么,这严重阻碍了交互式Web应用程序的实现。所以凭借Cookie可以保存状态信息,如是否登录,购物车信息等。
缺陷
- Cookie会被附加在每个HTTP请求中,所以无形中增加了流量。
- 由于在HTTP请求中的Cookie是明文传递的,所以安全性成问题,除非用HTTPS。
- Cookie的大小限制在4KB左右,对于复杂的存储需求来说是不够用的。
应用
- 登录
- 购物车
- 记录网页的浏览习惯
django中操作cookie
流程
cookie是服务器产生的一段随机的字符串,发送给客户端,随后客户端便保存cookie,并使用这个cookie附带进后续的请求
- 客户端发起一个请求连接(如HTTP GET)。
- 服务器在http响应头上加上
Set-Cookie
,里面存放字符串的键值对。 - 客户端随后的http请求头加上
Cookie
首部,它包含了之前服务器响应中设置cookie的信息。
设置
两种设置方式
普通的cookie
response.set_cookie(k1,v1)
本质是
ret['Set-Cookie'] = 'is_login=1000; path=/'
加密的cookie
1
ret.set_signed_cookie('is_login','yes',salt='super')
设置cookie的参数:
参数 | 含义 |
---|---|
key | 键 |
value | 值 |
max_age=None | 超时时间, 如5秒后超时,max_age=5 |
expires=None | 超时时间(IE requires expires, so set it if hasn’t been already.) |
path=’/home/‘ | Cookie生效的路径,例如:只有访问 home才会带着cookie,其它页面不会带着。 一般情况设置为 ‘/‘ |
domain=None | Cookie生效的域名 |
secure=True | https传输的时候才会携带cookie,http传输不会携带 |
httponly=False | 只能http协议传输,无法被JavaScript获取(不是绝对,底层抓包可以获取到也可以被覆盖) |
获取
普通的
1 | request.COOKIES.get('is_login') |
加密的
1 | request.get_signed_cookie('is_login',default='',salt='super') |
加密只是在原来的基础后面加一段。
get_signed_cookie方法的参数:
- default: 默认值
- salt: 加密盐
- max_age: 后台控制过期时间
删除 (注销)
1 | def logout(request): |
浏览器中分析
login/:
Response Headers: Set-Cookie: is_login=yes; Path=/
home/
Cookie:
Request Headers
例子
实现登录,跳转,注销。
1 | def login(request): |
完善功能
- 增加装饰器
- 对于其它页面的cookie验证,使用一个装饰器来进行检测,而不用在每个函数内增加逻辑。
1 | def login_required(func): |
- 解释:
1 | # 装饰器中 |
这样改是为了,如果我们从其它页面点击登录,登陆成功后可以回到该页面,如从index到登录,然后再回到index。
- 补充:
1 | <form action="" method="post"> |
action=""
会携带后面的 ?returnurl
,但如果form表单中的 action属性中 写了 /login/ 则只会返回到home页面,因为写死了,从index到登录,但回不到index了。
- 补充:
如果从index点击登录,登陆的时候,用户名密码输入错误,登陆失败,那么url后面的参数returnurl还携带吗?
会的,因为render只是返回一个页面,如果form中没有设置action,登陆成功后依然会跳转到原来的页面(index)
session
定义:
- 保存在服务器的一组组键值对,但是必须依赖于cookie 。
为什么要用session
- cookie保存在浏览器上,存在安全问题。
- 浏览器对cookie的大小有限制。
django中操作session
流程
session是一个QueryDict(类字典,多了getlist方法)
设置
1 | request.session['is_login'] = '1000' |
session默认保存到数据库中。
设置后需要执行 migrate命令,在数据库中建表。
获取
1 | is_login = request.session.get('is_login') |
删除
del request.session[key]
request.session.pop(‘key’)
request.session.delete()
删除数据库中的session数据,不删除cookie,但是登陆后也会重新设置cookie。request.session.flush()
删除数据库中的session数据,删除cookie
其它操作
将所有Session失效日期小于当前日期的数据删除
1 | request.session.clear_expired() |
设置会话Session和Cookie的超时时间
1 | request.session.set_expiry(value) |
- 0 浏览器关闭的时候结束
- 可以设置datetime
- 可以设置多少秒
- None 不超时
获取sessionid的值
1 | request.session.session_key |
配置
session设置
from django.conf import global_settings
去这里找session配置
1 | # Cache to store session data if using the cache session backend. |
session_key是根据浏览器来设置的,如果在登录的基础上再登录,session_key是不会变的;换一个浏览器,会再表中增加一条新的记录,新的session_key。
其他类型的session
settings.py 中 ‘django.contrib.sessions’, 按着ctril + 鼠标左键,就可以到达。在sessions文件夹的backends中。
1 | 1. 数据库Session |
所以Django的cookie与session归功于settings
1 | apps |