Flask 在巨蟒之夜,我该如何尊重;“尺寸”;查询参数作为";的别名;“最大结果”;

Flask 在巨蟒之夜,我该如何尊重;“尺寸”;查询参数作为";的别名;“最大结果”;,flask,eve,Flask,Eve,我正在使用PythonEve开发一个API,我很喜欢它。到目前为止,我已经能够使用各种可用的钩子做任何事情。但是,现在我想支持“size”查询参数作为“max_results”的别名(如果有必要,出于向后兼容的原因) 我试图在\u pre\u GET hook上创建,但发现request.args是不可修改的 def pre_get_api_sugar(resource, request, lookup): """Event that adds syntactic sugar to th

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

我试图在\u pre\u GET hook上创建,但发现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
这就产生了类型错误:“ImmutableMultiDict”对象是不可变的

似乎操纵查询参数来定制API即使不容易也应该是可行的。到目前为止,我还没有找到一种方法。我应该使用烧瓶设备吗? 我错过了什么


谢谢

更新

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

QUERY_MAX_RESULTS = 'size'
覆盖默认设置(该设置仍然碰巧是
max\u results
)。为其他查询参数添加了类似的设置,如
where
排序
投影
页面
嵌入

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

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\u MAX\u RESULTS
),这些设置默认为当前值,但很容易更改。完成后,我会更新答案(您可能想更新,以免丢失)。

Nicola,感谢您的快速回答并提供帮助!我认为考虑一种更通用的方式来处理请求可能更有意义。pre_GET钩子现在只允许操作查找。为什么不在解析请求对象之后添加另一个钩子,或者甚至允许轻松定制请求解析本身呢?这将允许自定义实现而不是ParsedRequest,并提供许多可能性。这也是另一个有趣的选择。会玩一点的。谢谢。@DmitrySerebrennikov我更新了原始答案,因为查询参数现在可以完全自定义。