Flask之会话控制
http的会话控制
所谓的会话,就是客户端浏览器和服务端网站之间一次完整的交互过程。
会话的开始是在用户通过浏览器第一次访问服务端网站开始。
会话的结束时在用户通过关闭浏览器以后,与服务端断开。
所谓的会话控制,就是在客户端浏览器和服务端网站之间,进行多次http请求响应之间,记录、跟踪和识别用户的信息而已。
因为 http 是一种无状态协议,浏览器请求服务器是无状态的。
-
无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,每次请求都是一次新的请求。
-
无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且服务器也会在处理页面完毕之后销毁页面对象。
有时需要保持用户浏览的状态,比如用户是否登录过,浏览过哪些商品等
实现状态保持主要有两种方式:
- 在客户端存储信息使用
Cookie,token[jwt,oauth]
- 在服务器端存储信息使用
Session
Cookie
Cookie是由服务器端生成,发送给客户端浏览器,浏览器会自动将Cookie的key/value保存,下次请求同一网站时就发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie的key/value可以由服务器端自己定义。
使用场景: 登录状态, 浏览历史, 网站足迹, 购物车 [不登录也可以使用购物车]
Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用。
Cookie基于域名安全,不同域名的Cookie是不能互相访问的。
如访问oldboyedu.com时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到oldboyedu写的Cookie信息。
浏览器的同源策略针对cookie也有限制作用。
当浏览器请求某网站时,会将本网站下所有Cookie信息提交给服务器,所以在request中可以读取Cookie信息。
设置cookie
设置cookie需要通过flask的Response响应对象来进行设置,由flask内部提供了一个make_response函数给我们可以快速创建响应对象
from flask import Flask, make_response, request app = Flask(__name__) @app.route('/set_cookie') def set_cookie(): response = make_response('set_cookie') # response.set_cookie("变量名", "变量值", max_age="有效期几秒") response.set_cookie('name', 'pure') # 不设置max_age,过期时间是会话期,关闭浏览器以后,自动删除 response.set_cookie('age', '18', max_age=3600) # 在指定max_age时间以后,才会自动删除 return response if __name__ == '__main__': app.run(debug=True)
获取cookie
获取客户端发送过来的cookie要通过request.cookies
来完成
注意:如果没有先生产cookie,直接获取会报错。
from flask import Flask, make_response, request app = Flask(__name__) @app.route('/get_cookie') def get_cookie(): # request.cookies 获取全部cookie name = request.cookies.get('name') age = request.cookies.get('age') return f"name={name}&age={age}" if __name__ == '__main__': app.run(debug=True)
删除cookie
cookie的删除必须要通过response对当前cookie设置无效的值或者过期的有效时间,让浏览器自动删除
from flask import Flask, make_response, request app = Flask(__name__) @app.route("/del_cookie") def del_cookie(): response = make_response("del cookie") response.set_cookie("name","",expires=0) return response if __name__ == '__main__': app.run(debug=True)
当删除name
属性后,再次获取cookie是name
属性已经消失了
Session
对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如用户名、余额、等级、验证码等信息。在服务器端进行状态保持的方案就是Session
。
Session依赖于Cookie,session的ID一般默认通过cookie来保存到客户端。
session的有效期默认是会话期,会话结束了,session就废弃了。
如果将来希望session的生命周期延长,可以通过修改cookie中的sessionID来完成配置。
flask中的session需要加密,所以使用session之前必须配置SECRET_KEY选项,否则报错。
设置session
from flask import Flask, session app = Flask(__name__) class Config(object): # 使用session之前,必须先设置秘钥 SECRET_KEY = "123903tklasdlkas@" app.config.from_object(Config) @app.route('/set_session') def set_session(): """设置session数据""" session["name"] = "pure" session["age"] = 18 session["book_list"] = [{"title": "book_name"}, {"title": "book_name"}] return "set_session" if __name__ == '__main__': app.run(host="0.0.0.0", port=5000, debug=True)
获取session
from flask import Flask, session app = Flask(__name__) class Config(object): # 使用session之前,必须先设置秘钥 SECRET_KEY = "123903tklasdlkas@" app.config.from_object(Config) @app.route('/get_session') def get_session(): """获取session数据""" name = session.get("name") age = session.get("age") book_list = session.get("book_list") return f"name={name} & age={age} & book_list = {book_list}" if __name__ == '__main__': app.run(host="0.0.0.0", port=5000, debug=True)
删除session
from flask import Flask, session app = Flask(__name__) class Config(object): # 使用session之前,必须先设置秘钥 SECRET_KEY = "123903tklasdlkas@" app.config.from_object(Config) @app.route('/del_session') def del_session(): """删除session数据""" if session.get("name"): del session["name"] return "ok" if __name__ == '__main__': app.run(host="0.0.0.0", port=5000, debug=True)
补充:token
-
token是一种用户身份认证信息的技术,一般我们称之为:Token认证。
-
翻译中文:token一般叫令牌
-
本质就是一个经过特殊处理的字符串,往往在字符串内部隐藏着识别用户身份信息的关键内容。
-
一般开发中,token往往都是以识别用户身份为目的来使用的。
-
一般使用情况下,token会以用户身份信息,当前事件戳,随机数等因子构成的。
-
当然,更多情况下,token一般分三段:"头部.载荷.签证"
-
像实际开发中,我们一般说的jwt,csrf等等场景里面的token都是这一类的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· 什么是nginx的强缓存和协商缓存
· 一文读懂知识蒸馏
· Manus爆火,是硬核还是营销?