Flask不同路由间存储对象、变量和列表的轻量实现方案咨询
针对Flask跨路由数据存储问题的解决方案
问题1:实现跨路由对象/列表持久化的最简方案
不用数据库的前提下,最低改造成本的方案是使用flask-session将session存储在服务端,完全适配你当前的轻量需求:
- 默认Flask的session是存在客户端Cookie中,容量小且不安全,
flask-session会把session内容存储在服务端,客户端仅留存一个无意义的session_id标识,完美解决大对象存储和跨路由访问问题 - 仅需要几行代码即可完成配置:
from flask import Flask, session from flask_session import Session import tempfile app = Flask(__name__) # 配置session存储到本地临时文件 app.config["SESSION_PERMANENT"] = False app.config["SESSION_TYPE"] = "filesystem" app.config["SESSION_FILE_DIR"] = tempfile.gettempdir() # 存在系统临时目录,自动清理过期内容 app.secret_key = "自定义随机加密字符串" Session(app)
- 后续计算生成的帕累托投资组合对象、列表可以直接存入
session,例如session['user_portfolios'] = 计算结果,所有路由都可以直接读写,不同用户的session天然隔离,不会出现数据混淆,且完全不需要修改现有业务逻辑 - 该方案完全可以支撑50个用户同时使用的并发需求,无明显性能瓶颈
问题2:使用数据库的最优处理逻辑
如果需要长期留存数据、支持更复杂的查询操作,优先选择SQLite作为数据库,不需要额外部署数据库服务,单文件存储,是轻量场景的最优选择:
核心实现逻辑
- 无需用户登录,直接用用户的session_id作为唯一标识区分不同用户的数据,所有用户生成的数据都关联自己的session_id即可
- 推荐搭配
flask-sqlalchemy做ORM封装,不需要编写原生SQL,开发效率更高:
首先安装依赖:pip install flask-sqlalchemy
配置和建表示例:
from flask_sqlalchemy import SQLAlchemy app.config["SQLALCHEMY_DATABASE_URI"] = "sqlite:///portfolios.db" app.config["SQLALCHEMY_TRACK_MODIFICATIONS"] = False db = SQLAlchemy(app) # 投资组合数据表 class Portfolio(db.Model): id = db.Column(db.Integer, primary_key=True) sid = db.Column(db.String(255), nullable=False, index=True) # 存储用户session_id,用于用户区分 params = db.Column(db.JSON, nullable=False) # 存储用户提交的表单参数 result = db.Column(db.JSON, nullable=False) # 存储计算生成的投资组合结果,列表对象可直接转JSON存储 create_time = db.Column(db.DateTime, server_default=db.func.now()) # 首次启动前执行一次建表操作 with app.app_context(): db.create_all()
- 读写逻辑:
- 计算完成后存数据:创建
Portfolio实例,填入对应字段后执行db.session.add(实例)、db.session.commit()即可 - 其他路由查询当前用户数据:
user_data = Portfolio.query.filter_by(sid=session.sid).order_by(Portfolio.create_time.desc()).all(),只会返回当前用户的历史数据,不会和其他用户混淆
- 该方案不需要额外部署服务,支撑50并发无压力,后续如果要新增用户登录功能,只需要新增
user_id字段关联即可,扩展性良好
内容的提问来源于stack exchange,提问作者user13723178
相关产品推荐
相关产品推荐

