1

我正在使用 python-eve 开发一个 API 并喜欢它。到目前为止,我已经能够使用各种可用的钩子来做所有事情。但是,现在我想支持“size”查询参数作为“max_results”的别名(出于向后兼容性的原因,如果这很重要)。

我试图创建 on_pre_GET 钩子,但发现 request.args 是不可修改的

def pre_get_api_sugar(resource, request, lookup):
    """Event that adds syntactic sugar to the API calls.
    """

    # Support "size" as alias for "max_results"
    args = request.args
    if 'max_results' not in args and 'size' in args:
        args['max_results'] = args['size']


app.on_pre_GET += pre_get_api_sugar

这给TypeError: 'ImmutableMultiDict' objects are immutable

似乎操纵查询参数来自定义 API 应该是可行的,如果不容易的话。到目前为止,我还没有看到这样做的方法。我应该使用 Flask 工具吗?我错过了什么?

谢谢!

4

1 回答 1

1

更新

Eve 0.5-dev 中添加了可自定义的查询参数,现在您可以设置

QUERY_MAX_RESULTS = 'size'

覆盖默认设置(仍然是max_results)。已为其他查询参数(如where, sort, projection, page, )添加了类似设置embedded

原始答案 正如您所说,Flask(和 Eve)使用不可变对象来存储 request args。但是,您可以选择使用parameter_storage_class来更改默认类:

the class to use for args and form. The default is an ImmutableMultiDict which supports multiple
values per key. alternatively it makes sense to use an ImmutableOrderedMultiDict which preserves
order or a ImmutableDict which is the fastest but only remembers the last key. It is also possible
to use mutable structures, **but this is not recommended**.

最后一句话的重点是我的。

话虽这么说,允许 API 维护人员自定义其 API 的查询方言可能是一个好主意,所以我想我将添加新设置(类似于QUERY_MAX_RESULTS),这些设置默认为当前值,但可以轻松更改。完成后我会更新答案(您可能想打开一张票,所以它不会丢失)。

于 2014-10-15T07:51:26.373 回答