【问题标题】:How to define a custom filter and bind it to a resource endpoint如何定义自定义过滤器并将其绑定到资源端点
【发布时间】:2015-12-25 03:43:48
【问题描述】:

我正在使用 Python EVE、EVE-SQLAlchemy、Flask、Flask-SQLAlchemy、SQLAlchemy 和 Postgres 数据库。

我的 API 端点已全部设置完毕,而且它们开箱即用。

现在我正在尝试过滤 some_model 资源返回的项目,以便它只返回属于某个用户(执行 API 请求的用户)或具有特定名称(前缀)。执行此操作的 SQLAlcehmy 代码如下:

session.query(SomeModel).filter(or_(SomeModel.name.like('SOMETHING_%'), SomeModel.account_id==1)).all()

我查看了 pre 和 post 请求挂钩、用户限制资源访问以及我能找到的所有其他内容,但似乎没有任何地方描述如何将自定义过滤器应用于某个端点/资源的(所有)GET 请求。

有点像 URL 过滤器功能,但始终在数据库级别而不是序列化/响应级别进行过滤。

【问题讨论】:

    标签: python sqlalchemy eve


    【解决方案1】:

    如果我理解正确,看起来Pre-Request Event Hook 中的Dynamic Lookup Filter 可以满足您的过滤需求。

    【讨论】:

    • 您是否设法使事件挂钩在 SomeModel GET 调用之前被调用?如果是这样,您只需要在那里更改查找过滤器(我不知道 EVE-SQLAlchemy 语法是如何)。我没有测试 EVE-SQLAlchemy 的环境,所以我的示例将使用标准的 mongo 查找。如果有帮助,我可以发布 MongoDB 的工作代码。
    • 我有,但是无法访问 sql alchemy 查询对象。我也无法计算出 sqlalchemy 过滤器。目前,我添加了另一个钩子作为 pre_query 钩子,它公开了光标,从而查询对象,然后您可以对其进行修改。似乎工作得很好,但“适当”或受支持的方法会很好。
    【解决方案2】:

    我不知道like 查询的确切语法,但or 可以这样实现:(我已经测试过了,它有效)

    def pre_GET(resource, request, lookup):
        # only return documents for account_id 1 or where name is metalstorm
        lookup['or_'] = [{'account_id': 1}, {'name': 'metalstorm'}]
    

    对于like 查询,查看this 是否有帮助。

    【讨论】:

      猜你喜欢
      • 2011-06-22
      • 1970-01-01
      • 2011-09-05
      • 2020-03-29
      • 1970-01-01
      • 1970-01-01
      • 2018-02-21
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多