是否可以将传入的请求有效负载作为方法/函数参数在瓶或瓶中取消?如果是这样的话,是怎么做的?
我想说,作为一个POST/PUT请求的请求有效负载,
{ 'foo': [ 'bar1', 'bar2'], 'spam': 2 }把这个用在伪码里,
@route('/cheeseshop/<id>', method='PUT')
def cheeseShop(foo, spam):
pass可以自动查看这些框架中的内容类型吗?
发布于 2013-09-02 08:44:56
为了代码的可读性,在这样做时有一些警告,但可能的解决方案如下所示。
定义序列化方法。如果您需要与不同的客户工作,我建议JSON。
创建一个装饰器,并将其放在function和route之间
@route(...)
@expandargs
def foo(id, bar, baz):
...在装饰器中,使用request.json() (如果它是JSON自动解码有效载荷)来扩展arg,然后使用原始args和新的**expandedargs调用包装函数(注意双星号会爆炸关键字)。
当混合位置和关键字args时会出现问题。
发布于 2018-07-26 10:12:45
这当然只是勾勒出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。另外,如果在视图中提供了未命名的have参数,则会得到带有意外关键字的Type错误。
因此,一个稍微宽松一些的定义是:
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'https://stackoverflow.com/questions/18567267
复制相似问题