これは、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 は Internal Server Error を返します。これは、関数が同じキーワードに対して複数のキーワード引数を受け取るために Python が TypeError をスローするためです。また、ビューで名前が付けられていない have パラメーターを指定すると、予期しないキーワードで型エラーが発生します。
したがって、もう少し寛大な定義は次のようになります。
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'