具有用户解析和过滤的 Flask-restless 端点

Posted

技术标签:

【中文标题】具有用户解析和过滤的 Flask-restless 端点【英文标题】:Flask-restless endpoints with user resolution and filtration 【发布时间】:2015-06-15 09:39:52 【问题描述】:

应该如何正确看待只返回属于请求它们的用户的对象的 API?

api/version/items/<items_id>

api/version/user/<user_id>/items/<items_id>

在第一种情况下,服务器使用从其身份验证中获得的用户 ID 查询数据库。

我不知道如何在 Flask-restless 中创建这两种情况。我认为预处理器会很有用,我可以从授权(JWT 令牌)中获取 user_id,但我找不到将其用作 DB 搜索参数的方法。

from flask_jwt import JWT, jwt_required, current_user
...
manager.create_api(Item,
               methods=['GET'],
               collection_name='items',
               url_prefix='/api',
               preprocessors=dict(GET_SINGLE=[api_auth],GET_MANY=[api_auth]))   


@jwt_required()
def api_auth(*args, **kwargs):
    user_id = current_user.id
    # some code with user id addition.
    pass

【问题讨论】:

【参考方案1】:

预处理器将是您构建查询对象的地方。我认为项目的端点应该看起来很简单:

api/version/items

但是在预处理器中,您将构建一个查询对象,该对象将随请求一起传递:

GET api/version/items?q="filters":["name":"userid","op":"eq","val":10]

【讨论】:

【参考方案2】:

您应该使用直接引用您尝试查询的资源的端点。例如:

api/version/items

您应该分别定义get_singleget_many 预处理器。 instance_id 表示单个(整数)和 result 参数(字典)表示多个预处理器应该用于定义返回给用户的内容。

来自Flask-restless docs:

那些接受字典的预处理器和后处理器 参数可以(并且应该)就地修改它们的参数。那 表示对结果字典所做的更改将是 被 Flask-Restless 视图函数看到并最终返回到 客户。

因此,在您的预处理器中,您可以执行以下操作来检索数据库中的项目(在与用户的关系中定义):

@jwt_required()
def api_auth_get_many(instance_id=None, *args, **kwargs):
    user_id = current_user.id

    if instance_id in User.query.get(user_id).items:
        pass
    else:
        instance_id = None    # Do not return the value if not permitted

@jwt_required()
def api_auth_get_many(result=None, *args, **kwargs):
    user_id = current_user.id
    result = User.query.get(user_id).items   # Return all items allowed for user

【讨论】:

谢谢,但我认为您的第一种方法将称为“api_auth_get_single”,第二种方法是后处理器(不是预处理器),其中结果变量必须是 JSON 字典。

以上是关于具有用户解析和过滤的 Flask-restless 端点的主要内容,如果未能解决你的问题,请参考以下文章

使用请求时如何为 Flask-Restless 构建复杂的过滤器?

如何对 JSONB 内容运行 Flask-restless api 过滤器查询

从 Flask-restless 读取数据的 POST 请求

是否可以扩展 Flask-restless 以添加新路线?

flask-restless 限制 RESTful api 访问

使用flask-restless实现超媒体