web-dev-qa-db-ja.com

FlaskビューからJSONレスポンスを返す

PandasでCSVファイルを解析して要約情報付きの辞書を作成する機能があります。 Flaskビューからの応答として結果を返したいです。 JSONレスポンスを返すにはどうすればいいですか?

@app.route("/summary")
def summary():
    d = make_summary()
    # send it back as json
358
Code Ninja

要約データを jsonify 関数に渡して、JSON応答を返します。

from flask import jsonify

@app.route('/summary')
def summary():
    d = make_summary()
    return jsonify(d)

Flask 0.11から、あなたはトップレベルのオブジェクトとしてdictだけではなく、どんなJSONシリアライズ可能な型でも渡すことができます。

579
codegeek

jsonifyは、JSONに渡すデータをシリアル化します。データを自分でシリアル化したい場合は、jsonifyが行うことをstatus=200およびmimetype='application/json'を使用して応答を構築することによって行います。

from flask import json

@app.route('/summary')
def summary():
    data = make_summary()
    response = app.response_class(
        response=json.dumps(data),
        status=200,
        mimetype='application/json'
    )
    return response
160
scls

キーワード引数を flask.jsonify に渡すと、JSONオブジェクトとして出力されます。

@app.route('/_get_current_user')
def get_current_user():
    return jsonify(
        username=g.user.username,
        email=g.user.email,
        id=g.user.id
    )
{
    "username": "admin",
    "email": "[email protected]",
    "id": 42
}
105
zengr

何らかの理由でjsonifyを使いたくない場合は、手動で行うことができます。 flask.json.dumpsを呼び出してJSONデータを作成してから、application/jsonコンテンツタイプで応答を返します。

from flask import json

@app.route('/summary')
def summary():
    data = make_summary()
    response = app.response_class(
        response=json.dumps(data),
        mimetype='application/json'
    )
    return response
23
Anthony Awuley

ユーザーがアップロードしたファイルを分析したい場合は、Flask quickstart にユーザーからファイルを取得してアクセスする方法が表示されます。 request.filesからファイルを取得してそれを要約関数に渡します。

from flask import request, jsonify
from werkzeug import secure_filename

@app.route('/summary', methods=['GET', 'POST'])
def summary():
    if request.method == 'POST':
        csv = request.files['data']
        return jsonify(
            summary=make_summary(csv),
            csv_name=secure_filename(csv.filename)
        )

    return render_template('submit_data.html')

'data'request.filesキーを、HTMLフォームに入力されたファイルの名前に置き換えます。

16
teechap

ビュー関数からの戻り値をJSON応答に変換するデコレータを書くことができます。

def return_json(view):
    @functools.wraps(view)
    def wrapped_view(**values):
        return jsonify(view(**values))
    return wrapped_view


@app.route('/test/<arg>')
@return_json
def test(arg):
    if arg == 'list':
        return [1, 2, 3]
    Elif arg == 'dict':
        return {'a': 1, 'b': 2}
    Elif arg == 'bool':
        return True
    return 'non of them'
7
iman

Flask 0.11より前では、jsonfiyは配列を直接返すことを許可していませんでした。代わりに、リストをキーワード引数として渡します。

@app.route('/get_records')
def get_records():
    results = [
        {
          "rec_create_date": "12 Jun 2016",
          "rec_dietary_info": "nothing",
          "rec_dob": "01 Apr 1988",
          "rec_first_name": "New",
          "rec_last_name": "Guy",
        },
        {
          "rec_create_date": "1 Apr 2016",
          "rec_dietary_info": "Nut allergy",
          "rec_dob": "01 Feb 1988",
          "rec_first_name": "Old",
          "rec_last_name": "Guy",
        },
    ]
    return jsonify(results=list)
4
mania_device

Jsonified応答、andステータスコードを返すには、次のようにします。

from flask import jsonify, make_response

@app.route('/summary')
def summary():
    d = make_summary()
    return make_response(jsonify(d), 200)

フラスコに対するこの bug からのインスピレーション

1
rouble

Rest apiを実装するためにjson応答を返す必要がある場合は、flask-restful( https://flask-restful.readthedocs.io/en/latest/quickstart.html )を使用できます。私はこの解決策がよりシンプルで弾力性があり、そしてどういうわけかよりエレガントであると信じています。

これが彼らのクイックスタートです。

from flask import Flask
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

class HelloWorld(Resource):
    def get(self):
        return {'hello': 'world'}

api.add_resource(HelloWorld, '/')

if __== '__main__':
    app.run(debug=True)
0
Rafael Borja

Python Flask JSON:

from flask import Flask, jsonify,request,json


app = Flask(__name__)



country = [
            {'name':'india'},
            {'name':'pakistian'},
            {'name':'US'},
            {'name':'UK'},
            {'name':'NZ'}
            ]


@app.route('/', methods=['GET'])
def test():

    return jsonify({
        'message': 'Hai'
    })



@app.route('/country', methods=['GET'])
def countryall():

    return jsonify({

        'country':country
    })


if __== '__main__':
    app.run(debug=True, port=8080)
0
Sankar guru