Flaskを使って簡単なAPIを構築しようとしています。ここではPOSTされたJSONを読みたいと思います。私は PostMan Chromeエクステンション で投稿をしています、そして私が投稿したJSONは単に{"text":"lalala"}
です。次の方法でJSONを読みます。
@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
content = request.json
print content
return uuid
ブラウザではGETで入力したUUIDを正しく返しますが、コンソールではNone
を出力します({"text":"lalala"}
を出力することを想定しています)。 ?
まず第一に、.json
属性は推奨されなくなりました。 request.get_json()
メソッド を使用してください。
application/json
プロパティと.get_json()
メソッドが機能するためには、リクエストコンテンツタイプを.json
に設定する必要があります。そうでなければNone
を生成します。 Flask Request
のドキュメントを参照してください :
MIMEタイプがJSONを示している場合( application/json 、
is_json()
を参照)、解析されたJSONデータが含まれます。それ以外の場合はNone
になります。
force=True
を設定することで、コンテンツタイプの要件をスキップするようにrequest.get_json()
に指示できます。
この時点で exception が発生した場合(おそらく400 Bad Request応答が返される場合)、JSON data は無効です。何らかの形で不正です。 JSONバリデーターでそれをチェックしたいかもしれません。
参考までに、Pythonクライアントからjsonを送信する方法の完全なコードを次に示します。
import requests
res = requests.post('http://localhost:5000/api/add_message/1234', json={"mytext":"lalala"})
if res.ok:
print res.json()
「json =」入力は、ここで説明しているように、コンテンツタイプを自動的に設定します。 Pythonリクエストを使用したJSONの投稿
そして上記のクライアントはこのサーバーサイドコードで動作します。
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
content = request.json
print content['mytext']
return jsonify({"uuid":uuid})
if __== '__main__':
app.run(Host= '0.0.0.0',debug=True)
これが私のやり方です。
@app.route('/api/add_message/<uuid>', methods=['GET', 'POST'])
def add_message(uuid):
content = request.get_json(silent=True)
# print(content) # Do your processing
return uuid
silent=True
が設定されていると、get_json
関数はjson本体を取得しようとすると黙って失敗します。デフォルトではこれはFalse
に設定されています。
force=True
を設定すると、flaskがあなたに代わるrequest.headers.get('Content-Type') == 'application/json'
チェックを無視します。デフォルトではこれもFalse
に設定されています。
flaskのドキュメント を参照。
より明示的にするために、force=False
を残してクライアントにContent-Type
ヘッダーを送信させることを強くお勧めします。
お役に立てれば!
この解決策はうまくいきます:
from flask import Flask, request, jsonify
app = Flask(__name__)
@app.route('/hello', methods=['POST'])
def hello():
return jsonify(request.json)
パラメータを使用してJSONデータを解決できます。
import flask
from flask import request, jsonify
import Parameters
application = flask.Flask(__name__)
@application.route('/myappp', methods=['POST'])
@cross_Origin('*')
def User_details_by_mailID():
payload = request.get_json()
email = payload[Parameters.email]
return jsonify(email)