web-dev-qa-db-ja.com

Flask requestおよびapplication / jsonコンテンツタイプ

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に常にアクセスできるようにするだけです。

25
danielrvt

request.get_json() を使用し、forceTrueに設定します。

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

ドキュメントから:

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

パラメーター:

  • forceTrueに設定されている場合、MIMEタイプは無視されます。

古いFlaskバージョン、<0.10、寛容でJSONを許可したい場合、常に、明示的にデコードを行うことができます:

from flask import json

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

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

12
josebama