这是因为只是勾勒出 Paolos 的答案,但为了帮助其他人寻找这个,这里有一个实现目标的解组装饰器示例。
from functools import wraps
def unmarshal_payload(view):
@wraps(view)
def unmashalled_view(*args, **kwargs):
return view(*args, **request.get_json(), **kwargs)
return unmashalled_view
然后将用作:
@app.route(f'/<int:id>/', methods=['PUT'])
@unmarshal_payload
def view(id, foo, bar):
print(id, foo, bar)
return 'Success'
然后根据您想要如何处理包含{'id': 'something'} 的有效负载之类的内容,您可以更改它。就像在这个幼稚的实现中一样,Flask 将返回一个内部服务器错误,因为 python 会抛出一个 TypeError,因为函数接收同一关键字的多个关键字参数。此外,如果您提供未在视图中命名的参数,则会收到带有 Unexpected 关键字的类型错误。
所以稍微宽松一点的定义是:
from functools import wraps
def unmarshal_payload(view):
@wraps(view)
def unmashalled_view(*args, **kwargs):
return view(*args, **kwargs, **{k:v for k,v in request.get_json().items() if k not in kwargs})
return unmashalled_view
@app.route(f'/<int:id>/', methods=['PUT'])
@unmarshal_payload
def view(id, foo, bar, **kwargs):
print(id, foo, bar)
return 'Success'