31

次のビューのフラスコアプリがあります。

@menus.route('/', methods=["PUT", "POST"])
def new():
    return jsonify(request.json)

ただし、これはリクエストのコンテンツタイプがに設定されている場合にのみ機能します。application/jsonそれ以外の場合、dictrequest.jsonはNoneです。

リクエストの本文が文字列として含まれていることは知ってrequest.dataいますが、クライアントがリクエストのコンテンツタイプの設定を忘れるたびに、それをdictに解析したくありません。

すべての着信リクエストのコンテンツタイプがであると想定する方法はありapplication/jsonますか?request.jsonクライアントがアプリケーションのcontent-typeをjsonに設定するのを忘れた場合でも、常に有効なdictにアクセスできるようにするだけです。

4

2 に答える 2

58

使用してrequest.get_json()設定:forceTrue

@menus.route('/', methods=["PUT", "POST"])
def new():
    return jsonify(request.get_json(force=True))

ドキュメントから:

デフォルトでは、この関数はmimetypeがである場合にのみjsonデータをロードしますが、これはforceパラメーターapplication/jsonでオーバーライドできます。

パラメーター:

  • forceTrueに設定すると、mimetypeは無視されます。

古いFlaskバージョン(0.10未満)では、JSONを許容して許可したい場合は、常に、明示的に自分でデコードを行うことができます。

from flask import json

@menus.route('/', methods=["PUT", "POST"])
def new():
    return jsonify(json.loads(request.data))
于 2013-01-01T17:07:31.590 に答える
13

requestオブジェクトには、コンテンツタイプに関係なくjsonを提供できるメソッドがすでに含まれているためget_json、で実行するとforce=True、コードは次のようになります。

@menus.route('/', methods=["PUT", "POST"])
def new():
    return jsonify(request.get_json(force=True))

実際、フラスコのドキュメントには、次のrequest.get_json代わりに使用する必要があると記載されています:http request.json: //flask.pocoo.org/docs/api/?highlight=json#flask.Request.json

于 2013-10-25T13:03:21.283 に答える