我正在使用python-eve开发一个API并且喜欢它。到目前为止,我已经能够使用各种可用的钩子做任何事情。但是,现在我想支持"尺寸"查询参数作为" 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设施吗? 我错过了什么?
谢谢!
答案 0 :(得分:1)
<强>更新强>
自定义查询参数已添加到Eve 0.5-dev,现在您可以设置
QUERY_MAX_RESULTS = 'size'
覆盖默认设置(仍然恰好是max_results
)。已为其他查询参数添加了类似设置,例如where
,sort
,projection
,page
,embedded
。
原始回答
正如你所说,Flask(和Eve)使用不可变对象来存储请求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
这样的思考)默认为当前值但可以很容易地改变。我会在完成后更新答案(你可能想要open a ticket,所以它不会丢失)。