【问题标题】:Using request data outside of routing endpoint在路由端点之外使用请求数据
【发布时间】:2016-03-08 20:49:49
【问题描述】:

我正在使用 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: working outside of request context.

作为测试,我尝试在端点中定义类,它在我第一次点击端点并实例化模型时工作,但是当我之后点击端点时,我得到一个错误sqlalchemy.exc.InvalidRequestError: Table '[tablename]' is already defined for this MetaData instance. Specify 'extend_existing=True' to redefine options and columns on an existing Table object.

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

【问题讨论】:

    标签: python api flask routing httprequest


    【解决方案1】:

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

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

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

    user = Column(String(48), default=lambda: request.remote_user)
    

    request 仅在您与数据库交互时得到解决。需要注意的是,当您不在请求上下文中时,您将无法使用此模型类。

    【讨论】:

    • 这很完美,正好适合我的用例。谢谢!我正在为此而努力。现在我看到了使用 lambda 函数的实用性。
    猜你喜欢
    • 2013-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 2021-10-05
    • 2020-08-09
    • 1970-01-01
    • 2011-05-05
    相关资源
    最近更新 更多