flaskアプリには次のビューがあります:
@menus.route('/', methods=["PUT", "POST"])
def new():
return jsonify(request.json)
ただし、これは、リクエストのコンテンツタイプがapplication/json
に設定されている場合にのみ機能します。それ以外の場合、dict request.json
はNoneです。
request.data
にはリクエストボディが文字列として含まれていることは知っていますが、クライアントがリクエストのコンテンツタイプを設定するのを忘れるたびに解析して辞書にしたくはありません。
すべての着信要求のコンテンツタイプがapplication/json
であると想定する方法はありますか?クライアントがアプリケーションのコンテンツタイプをjsonに設定し忘れた場合でも、有効なrequest.json
dictに常にアクセスできるようにするだけです。
request.get_json()
を使用し、force
をTrue
に設定します。
@menus.route('/', methods=["PUT", "POST"])
def new():
return jsonify(request.get_json(force=True))
ドキュメントから:
デフォルトでは、この関数はmimetypeが
application/json
の場合にのみjsonデータをロードしますが、これはforceパラメーターでオーバーライドできます。パラメーター:
- force–Trueに設定されている場合、MIMEタイプは無視されます。
古いFlaskバージョン、<0.10、寛容でJSONを許可したい場合、常に、明示的にデコードを行うことができます:
from flask import json
@menus.route('/', methods=["PUT", "POST"])
def new():
return jsonify(json.loads(request.data))
request
オブジェクトには既にメソッドget_json
があり、force=True
で実行すると、コンテンツタイプに関係なくjsonを提供できるため、コードは次のようになります。
@menus.route('/', methods=["PUT", "POST"])
def new():
return jsonify(request.get_json(force=True))
実際、flaskのドキュメントでは、request.get_json
の代わりにrequest.json
を使用する必要があります: http://flask.pocoo.org/docs/api /?highlight=json#flask.Request.json