gpt4 book ai didi

python - 在路由端点之外使用请求数据

转载 作者:太空宇宙 更新时间:2023-11-03 17:11:03 24 4
gpt4 key购买 nike

我正在使用 Flask 作为 API。在我的路由端点之一中,我想使用带有flask.request对象的remote_user属性的模型实例作为默认值。

我的模型的类定义是:

class Results(db.Model):
__tablename__ = 'results'
id = Column(Integer, primary_key=True, autoincrement=True)
sid = Column(Integer)
attribute = Column(String(2048))
value_s = Column(String(2048))
value_d = Column(Float)
user = Column(String(48), default=request.remote_user)

问题是我需要在端点之外定义此类,但是当我在端点之外使用请求对象时,我收到错误:RuntimeError:在请求上下文之外工作。

作为测试,我尝试在端点中定义类,它在我第一次访问端点并实例化模型时有效,但是当我之后访问端点时,我收到一个错误:sqlalchemy. exc.InvalidRequestError:表“[tablename]”已为此元数据实例定义。指定“extend_existing=True”以重新定义现有 Table 对象上的选项和列。

我需要在另一个端点中使用此模型类,那么如何使用端点中请求上下文之外的请求对象定义我的模型类?

最佳答案

flask.request是仅在请求期间有效的代理。这些模型已添加到 MetaData on startup ,因此它会在收到请求之前尝试解析默认值 request.remote_address

当您将模型声明移至 API 层时,模型会在每个请求上实例化,这会引发错误,因为 MetaData 仅接受唯一的表名称。

SQLAlchemy 允许您定义一个函数作为字段的默认值。此处的区别在于,可调用对象仅在插入或更新时执行。因此,如果您将字段定义为:

user = Column(String(48), default=lambda: request.remote_user)
仅当您与数据库交互时,

请求才会得到解决。需要注意的是,当您不在请求上下文中时,您将无法使用此模型类。

关于python - 在路由端点之外使用请求数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34079565/

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