具有用户分辨率和过滤功能的烧瓶不休息端点


如何

正确看待仅返回属于请求它们的用户的对象的API?

api/version/items/<items_id>

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

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

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

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

预处理器将是构建查询对象的位置。我认为项目的端点应该看起来像:

api/version/items

但是,如果没有预处理器,您将构建一个随请求一起传递的查询对象:

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

应使用直接引用尝试查询的资源的终结点。例如:

api/version/items

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

来自 Flask-restless 文档:

那些接受字典作为的预处理器和后处理器 参数可以(并且应该)就地修改其参数。那 表示对结果词典所做的更改,例如,结果字典将是 由 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

相关内容

  • 没有找到相关文章

最新更新