首先浏览器和万维网服务器之间相互通信的规则是HTTP协议。
而HTTP协议是无状态的,虽然HTTP协议是基于TCP协议的,但却不像TCP协议那样有链接,也就是浏览器第二次访问服务器,服务器根本不知道你之前访问过。
但是有很多需求都是要保留状态的,比如登录等等,这时候需要Cookie和Session,它们是保留状态的一种技术。不限语言和框架
**cookie
的工作原理**是:由服务器产生内容,浏览器收到请求后保存在本地;当浏览器再次访问时,浏览器会自动带上cookie,这样服务器就能通过cookie的内容来判断这个是“谁”了。
Cookies分为两类,第一次get请求无所谓,第二次请求就会把上一次的response Cookies 拿来当Request Cookies带着提交请求
cookie虽然在一定程度上解决了“保持状态”的需求,但是由于cookie本身最大支持4096字节,以及cookie本身保存在客户端,可能被拦截或窃取,因此就需要有一种新的东西,它能支持更多的字节,并且他保存在服务器,有较高的安全性。这就是session
。
cookie本身就是一个键值对,存在于客户端,每次向服务器发送请求都带着cookie,服务端可以操作cookie
第一次:Cookie: csrftoken=hQm5UJl6eS8EfytkunJUIQrAG4SCSutz0GgdxmO1wQ51Ug28u27zHYHSCbwjgGwn;
服务端设置:`response.set_cookie(key,value)
第二次:
Cookie: csrftoken=hQm5UJl6eS8EfytkunJUIQrAG4SCSutz0GgdxmO1wQ51Ug28u27zHYHSCbwjgGwn;key=value
服务器通过request.COOKIES[key]就能记录状态了
一、操作Cookie
获取cookie:request.COOKIES[key]
设置cookie:response.set_cookie(key,value)
以上是Cookie相关,不常用
--------------------------------------分隔线---------------------------------------
下面是Session基于Cookie:
第一次:
Cookie: csrftoken=hQm5UJl6eS8EfytkunJUIQrAG4SCSutz0GgdxmO1wQ51Ug28u27zHYHSCbwjgGwn;
服务器设置:reqeust.session[key] = value 可以多个,
同时重要的是随机生成一个字符串并设置了Cookie:sessionid=glbp556kqqb5w0fjkwltnonijoxzcwuu发给客户端
之后会把sessionid作为键,设置的多个键值整体作为一个字典当成值存储在数据库
第二次:Cookie: csrftoken=hQm5UJl6eS8EfytkunJUIQrAG4SCSutz0GgdxmO1wQ51Ug28u27zHYHSCbwjgGwn; sessionid=glbp556kqqb5w0fjkwltnonijoxzcwuu
服务器可以通过sessionid找到对应的值,通过request.session[key]获取
二、操作Session(session默认在服务器端保存15天)
获取session:request.session[key]
设置session:reqeust.session[key] = value
删除session:del request.session[key]
(这个删除其实就是把数据库的session_data更新为一个其他的值了,并没有立即删除)
request.session.set_expiry(value)
- 如果value是个整数,session会在些秒数后失效。
- 如果value是个datatime或timedelta,session就会在这个时间后失效。
- 如果value是0,用户关闭浏览器session就会失效。
- 如果value是None,session会依赖全局session失效策略。
django的session默认是存储在数据库里的,需要初始化数据库表