web-dev-qa-db-ja.com

フラコにPOSTされたjsonを取得する方法?

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"}を出力することを想定しています)。 ?

238
kramer65

まず第一に、.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バリデーターでそれをチェックしたいかもしれません。

325
Martijn Pieters

参考までに、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)
61
Luke

これが私のやり方です。

@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ヘッダーを送信させることを強くお勧めします。

お役に立てれば!

54
radtek

この解決策はうまくいきます:

from flask import Flask, request, jsonify

app = Flask(__name__)


@app.route('/hello', methods=['POST'])
def hello():
   return jsonify(request.json)
15
trojek

パラメータを使用して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)
0
Aakash Handa