news 2026/6/19 17:13:08

http的会话控制(flask)

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
http的会话控制(flask)

http的会话控制

所谓的会话(session),就是客户端浏览器和服务端网站之间一次完整的交互过程.

会话的开始是在用户通过浏览器第一次访问服务端网站开始.

会话的结束时在用户通过关闭浏览器以后,与服务端断开.

所谓的会话控制,就是在客户端浏览器和服务端网站之间,进行多次http请求响应之间,记录、跟踪和识别用户的信息而已。

为什么要有会话控制?因为 http 是一种无状态协议,浏览器请求服务器是无状态的。

无状态:指一次用户请求时,浏览器、服务器无法知道之前这个用户做过什么,对于服务端而言,客户端的每次请求都是一次新的请求。

无状态原因:浏览器与服务器是使用 socket 套接字进行通信的,服务器将请求结果返回给浏览器之后,会关闭当前的 socket 连接,而且客户端也会在处理页面完毕之后销毁页面对象。

有时需要保持下来用户浏览的状态,比如用户是否登录过,浏览过哪些商品等

实现状态保持主要有两种方式:

  • 在客户端存储信息使用Cookie(废弃),token[jwt,oauth]

  • 在服务器端存储信息使用Session,数据库

Cookie(了解)

Cookie是由服务器端生成一段能识别用户身份的文本信息,发送给客户端浏览器,浏览器会将Cookie的key/value保存,下次请求同一网站时就随着请求头自动发送该Cookie给服务器(前提是浏览器设置为启用cookie)。Cookie的key/value可以由服务器端自己定义。

使用场景: 登录状态, 浏览历史(网站足迹), 购物车[不登录也可以使用购物车]

Cookie是存储在浏览器中的一段纯文本信息,建议不要存储敏感信息如密码,因为电脑上的浏览器可能被其它人使用

Cookie基于域名安全,不同域名的Cookie是不能互相访问的。

如访问fuguang.com时向浏览器中写了Cookie信息,使用同一浏览器访问baidu.com时,无法访问到fuguang.com写的Cookie信息,只能获取到baidu.com的Cookie信息。

浏览器的同源策略针对cookie也有限制作用。

当浏览器请求某网站时,浏览器会自动将本网站下所有Cookie信息随着http请求头提交给服务器,所以在request中可以读取Cookie信息

设置cookie

设置cookie需要通过flask的Response响应对象来进行设置,由响应对象会提供了方法set_cookie给我们可以快速设置cookie信息。

from flask import Flask, make_response, request, redirect app = Flask(__name__) @app.route("/set_cookie") def set_cookie(): """cookie的设置""" # cookie保存客户端浏览器中的,所以cookie必须跟着响应对象返回给客户端 response = make_response("set_cookie") # 基于响应对象提供的set_cookie方法,可以设置单个cookie # response.set_cookie("变量名", "变量值", max_age="变量有效期") response.set_cookie("user_id", "100") # 如果没有设置max_age,则当前cookie变量会在浏览器关闭(会话结束以后被浏览器删除) response.set_cookie("username", "xiaoming", max_age=3600) # 如果设置max_age,则按秒作为时间单位,设置cookie的有效时间 response.set_cookie("number", "10000", max_age=30) # 如果设置max_age,则按秒作为时间单位,设置cookie的有效时间 return response @app.route("/get_cookie") def get_cookie(): """cookie的读取""" print("user_id=", request.cookies.get("user_id") ) print("username=", request.cookies.get("username")) print("number=", request.cookies.get("number")) return "get_cookie" # 删除cookie @app.route("/del_cookie") def del_cookie(): """cookie的删除""" # cookie保存客户端浏览器中的,所以服务端无法直接删除cookie # 要实现删除cookie,只能告诉浏览器,cookie过期了,让浏览器自动删除 response = make_response("del_cookie") response.set_cookie("user_id", "", max_age=0) response.set_cookie("username", "", max_age=0) return response # 基于cookie实现用户的例子 @app.route("/login", methods=["get", "post"]) def login(): """基于cookie实现登录""" form = """ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> 账号:<input type="text" name="username"><br><br> 密码:<input type="password" name="password"><br><br> <input type="submit" value="登录"> </form> </body> </html> """ if request.method == "GET": return make_response(form) """接收客户端POST提交表单数据""" # 暂时不使用数据库,我们模拟用户身份判断代码 username = request.form.get("username") password = request.form.get("password") if username == "root" and password == "123456": """认证通过""" # 基于cookie保存登录状态 response = make_response("登录成功!") response.set_cookie("username", username, max_age=7200) response.set_cookie("user_id", username, max_age=7200) return response else: """认证失败""" # 返回GET请求的login登录页面 response = redirect("/login") return response @app.route("/user") def user(): """在部分需要认证身份的页面中,基于cookie判断用户登录状态""" if not request.cookies.get("username"): response = redirect("/login") return response return "个人中心的信息展示" if __name__ == "__main__": app.run()

设置和删除cookie

模拟登录

Session

对于敏感、重要的信息,建议要存储在服务器端,不能存储在浏览器中,如手机号、验证码等信息

在服务器端进行状态保持的方案就是Session

Session依赖于Cookie,session的ID一般默认通过cookie来保存到客户端。名字一般叫:sessionid

flask中的session需要加密,所以使用session之前必须配置SECRET_KEY选项,否则报错。

注意:一般web框架都是把session数据保存到服务端,但是flask里面的session是基于token方式存储在客户端的,并没有安装传统的方式保存在服务端的文件中。

session的ID存在有效期的,默认是会话期,会话结束了,session_id就废弃了。

设置session
from flask import Flask, session,redirect,request,make_response app = Flask(__name__) # 因为flask中的session是基于cookie加密实现的,所以使用之前必须设置SECRET_KEY选项 app.config["SECRET_KEY"] = "dskafmdfmem2w4m234mfmvdfmasdkqaso3423" @app.route("/set_session") def set_session(): """设置session""" session["username"] = "xiaoming" session["user_id"] = 31 session["data"] = [1, 2, 3, 5, "AAAA"] return "set_session" @app.route("/get_session") def get_session(): """读取session""" print(f'username={session.get("username")}') print(f'user_id={session.get("user_id")}') print(f'data={session.get("data")}') return "get_session" @app.route("/del_session") def del_session(): """删除session""" session.pop("username") session.pop("data") return "del_session" # 基于session实现用户登录认证 @app.route("/login", methods=["get", "post"]) def login(): """基于session实现登录认证""" form = """ <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>Title</title> </head> <body> <form action="" method="post"> 账号:<input type="text" name="username"><br><br> 密码:<input type="password" name="password"><br><br> <input type="submit" value="登录"> </form> </body> </html> """ if request.method == "GET": return make_response(form) """接收客户端POST提交表单数据""" # 暂时不使用数据库,我们模拟用户身份判断代码 username = request.form.get("username") password = request.form.get("password") if username == "root" and password == "123456": """认证通过""" # 基于session保存登录状态 session["username"] = "root" session["user_id"] = "root" response = make_response("登录成功!") return response else: """认证失败""" # 返回GET请求的login登录页面 response = redirect("/login") return response @app.route("/user") def user(): """在部分需要认证身份的页面中,基于session判断用户登录状态""" if not session.get("username"): response = redirect("/login") return response return "个人中心的信息展示" if __name__ == "__main__": app.run(host='127.0.0.1',port=5000,debug=True)

设置session

可以通过客户端浏览器中的cookie观察到,在默认情况下,flask中的session数据会被保存到cookie中的(不安全)。当然,将来我们可以采用flask-session第三方模块把数据转存到服务端其他的存储设备,例如:redis或者mysql中。

删除session

模拟登录:

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/12 22:10:03

TLS网络安全协议巩固知识基础题(4)

1. 什么是TLS协议? 参考答案: TLS(Transport Layer Security)传输层安全协议是一种加密通信协议,用于在网络通信中提供安全性和数据完整性保护。它是SSL协议的继任者,目前广泛应用于HTTPS、FTP、SMTP等网络协议的安全传输。 2. TLS与SSL有什么区别? 参考答案: 版本演…

作者头像 李华
网站建设 2026/6/19 5:08:38

基于GoFrame与微内核架构的企业级物联网平台设计与实现

基于GoFrame与微内核架构的企业级物联网平台设计与实现 SagooIOT企业级物联网平台&#xff1a;毕业设计的理想选择与实用指南 在当今数字化时代&#xff0c;物联网技术正以前所未有的速度改变着我们的生活和工作方式。从智能家居到工业自动化&#xff0c;从智慧城市到农业监测…

作者头像 李华
网站建设 2026/6/19 2:56:26

GetQzonehistory终极指南:三步完成QQ空间数据完整备份

在数字记忆时代&#xff0c;QQ空间承载着我们太多的青春印记和珍贵回忆。那些年写过的说说、上传的照片、收到的留言&#xff0c;都是不可替代的数字资料。GetQzonehistory作为一款专业的QQ空间历史数据抓取工具&#xff0c;能够帮助用户轻松备份所有公开的说说内容&#xff0c…

作者头像 李华
网站建设 2026/6/18 19:11:15

哔哩下载姬DownKyi完整教程:从入门到精通的8大核心技巧

在内容爆炸的时代&#xff0c;B站已经成为学习、娱乐的重要平台。哔哩下载姬DownKyi作为专业的B站视频下载工具&#xff0c;让你能够高效保存和管理心仪的内容。本教程将带你从基础操作到高级技巧&#xff0c;全面掌握这款强大工具的使用方法。 【免费下载链接】downkyi 哔哩下…

作者头像 李华
网站建设 2026/6/13 11:20:09

Grafana MCP集成终极指南:5个快速提升监控效率的技巧

Grafana MCP集成终极指南&#xff1a;5个快速提升监控效率的技巧 【免费下载链接】mcp-grafana MCP server for Grafana 项目地址: https://gitcode.com/gh_mirrors/mc/mcp-grafana 在当今数据驱动的时代&#xff0c;有效的监控系统已经成为企业运维的必备工具。Grafana…

作者头像 李华
网站建设 2026/6/19 6:19:10

与节点-–-behaviac

原文 与&#xff08;And&#xff09;节点接受两个以上的条件子节点&#xff0c;执行逻辑”与&#xff08;&&&#xff09;”操作&#xff0c;如下图所示&#xff1a; 图1 与节点 只要有一个条件子节点的返回值为失败&#xff0c;与节点则返回失败。所有条件子节点都返…

作者头像 李华