0

受信リクエストのペイロードをボトルまたはフラスコのメソッド/関数引数として非整列化することは可能ですか? もしそうなら、どのように?

POST/PUT リクエストのリクエスト ペイロードとして次のように送信したいと思います。

{ 'foo': [ 'bar1', 'bar2'], 'spam': 2 }

これを疑似コードで次のように使用します。

@route('/cheeseshop/<id>', method='PUT')
def cheeseShop(foo, spam):
    pass

これらのフレームワークのいずれかでコンテンツ タイプを調べて、これを自動的に行うことはできますか?

4

2 に答える 2

1

コードを読みやすくするためにいくつかの注意事項がありますが、考えられる解決策は次のとおりです。

シリアル化方法を定義します。さまざまなクライアントと連携する必要がある場合は、 をお勧めしJSONます。

デコレータを作成し、それを yourfunctionroute

@route(...)
@expandargs
def foo(id, bar, baz):
    ...

デコレータでrequest.json()(ペイロードが の場合は自動的にデコードします) を使用して引数を展開し、ラップされた関数を元の関数と新しいJSON関数で呼び出します(キーワードを展開するための二重のアスタリスクに注意してください)。args**expandedargs

位置引数とキーワード引数を混在させると問題が発生します。

于 2013-09-02T08:44:56.073 に答える
0

これは、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'
于 2018-07-26T10:12:45.303 に答える