gpt4 book ai didi

flask - 如何在 flask 页面请求之间持久化查询?

转载 作者:行者123 更新时间:2023-12-03 17:12:07 28 4
gpt4 key购买 nike

我需要对多个页面请求运行相同的确切查询。
第一页呈现项目,第二页将项目导出到 Excel。

将查询直接存储在 session 中失败,因为 BaseQuery不是 JSON 可序列化的:

session['previous_query'] = SomeModel.query

下一个选项是将查询存储为字符串:
session['previous_query'] = str(SomeModel.query)

这可行,但我现在需要运行 session.execute:
db.session.execute(session['previous_query'])

这并没有给我 ORM 对象,而是没有关系的普通 dicts。

最后,我只能存储 id,但这需要我在两端多次运行查询,并且不会保留我需要的顺序。

有什么建议么?

最佳答案

您可以使用 SQLAlchemy Serializer 扩展来序列化查询:

from sqlalchemy.ext import serializer

session['previous_query'] = serializer.dumps(SomeModel.query, -1)

然后重构查询:
query = serializer.loads(session['previous_query'], db.metadata, db.session)
objects = query.all()

在哪里 db是你的 Flask-SQLAlchemy 集成对象。

在引擎盖下,它使用 pickle模块,但酸洗已被定制为更紧凑并省略 session 和引擎引用;当使用 serializer.loads() 加载序列化数据时,这些会再次加载.

要在 Python 2 上使用此功能,您需要设置协议(protocol)版本(第二个参数为 serializer.dumps()),因为序列化不适用于默认协议(protocol)版本 0。请选择版本 1 或 2,或使用 -1选择您的 Python 安装支持的最高版本。

因为这使用了泡菜,所以要小心从不受信任的来源加载泡菜; Flask session 是防篡改的,因为它是经过加密签名的,但是如果攻击者能够获得您的服务器端 secret ,那么攻击者可以通过向您发送一个精心制作的 serializer.loads() 的 pickle 来接管您的进程。装载。

关于flask - 如何在 flask 页面请求之间持久化查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25452179/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com