616

PandasでCSVファイルを分析し、要約情報を含むdictを生成する機能があります。Flaskビューからの応答として結果を返したいです。JSON応答を返すにはどうすればよいですか?

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

15 に答える 15

937

Flask 1.1.0以降、ビューはPython dictを直接返すことができ、Flaskはjsonify自動的に呼び出します。

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

Flaskのバージョンが1.1.0未満の場合、または別のJSONシリアル化可能なオブジェクトを返す場合は、をインポートして使用しますjsonify

from flask import jsonify

@app.route("/summary")
def summary():
    d = make_summary()
    return jsonify(d)
于 2012-10-26T15:33:57.280 に答える
268

jsonifyJSONに渡すデータをシリアル化します。自分でデータをシリアル化したい場合は、jsonifyとを使用して応答を作成status=200mimetype='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
于 2014-11-16T20:16:47.473 に答える
147

キーワード引数をに渡す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": "admin@localhost",
    "id": 42
}

すでにdictを持っている場合は、それを直接渡すことができますjsonify(d)

于 2012-10-26T06:11:55.313 に答える
45

何らかの理由で使用したくない場合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

flask.jsonjson組み込みモジュールとは異なります。可能な場合はより高速なsimplejsonモジュールを使用し、Flaskアプリとのさまざまな統合を可能にします。

于 2018-01-23T19:54:04.117 に答える
27

JSON応答を返し、ステータスコードを設定するには、次を使用できますmake_response

from flask import jsonify, make_response

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

FlaskIssueTrackerのこのコメントからインスピレーションを得ました。

于 2019-05-22T22:02:22.480 に答える
22

バージョン1.1.0Flaskの時点で、ビューがdictを返す場合、それはJSON応答に変換されます

@app.route("/users", methods=['GET'])
def get_user():
    return {
        "user": "John Doe",
    }
于 2019-11-18T15:18:13.333 に答える
17

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

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フォームに入力されたファイルの名前に置き換えます。

于 2013-12-05T16:44:35.217 に答える
13

Flask 1.1.xは、を呼び出さずにJSONdictを返すことをサポートしていますjsonify。dict以外のものを返したい場合でも、を呼び出す必要がありますjsonify

@app.route("/")
def index():
    return {
        "api_stuff": "values",
    }

と同等です

@app.route("/")
def index():
    return jsonify({
        "api_stuff": "values",
    })

これを追加したプルリクエストを参照してください:https ://github.com/pallets/flask/pull/3111

于 2020-05-14T08:32:56.537 に答える
12

デコレータを使用して、の結果を返しjsonfiyます。ビューに複数のリターンがあると、読みやすくなると思います。これは、のようなタプルを返すことをサポートしていませんcontent, statusが、代わりにエラーステータスを返すことを処理しますapp.errorhandler

import functools
from flask import jsonify

def return_json(f):
    @functools.wraps(f)
    def inner(**kwargs):
        return jsonify(f(**kwargs))

    return inner

@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 'none of them'
于 2016-06-10T13:37:31.097 に答える
5

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)
于 2016-06-26T15:42:58.877 に答える
5

Flask 1.1では、辞書を返すと自動的にJSONに変換されます。したがってmake_summary()、辞書を返す場合は、

from flask import Flask

app = Flask(__name__)

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

ステータスコードを含めることを要求するSOは、これと重複してクローズされました。したがって、その質問にも答えるために、フォームのタプルを返すことでステータスコードを含めることができます(dict, int)。はdictJSONに変換されint、HTTPステータスコードになります。入力がない場合、ステータスはデフォルトの200です。したがって、上記の例では、コードは200になります。以下の例では、201に変更されています。

from flask import Flask

app = Flask(__name__)

@app.route('/summary')
def summary():
    d = make_summary()
    return d, 201  # 200 is the default

ステータスコードは以下を使用して確認できます

curl --request GET "http://127.0.0.1:5000/summary" -w "\ncode: %{http_code}\n\n"
于 2020-01-03T14:37:43.230 に答える
1

答えは、Flaskのクラスベースのビューを使用する場合も同じです。

from flask import Flask, request, jsonify
from flask.views import MethodView

app = Flask(__name__)

class Summary(MethodView):
    def get(self):
        d = make_summary()
        return jsonify(d)

app.add_url_rule('/summary/', view_func=Summary.as_view('summary'))
于 2019-10-24T11:40:41.173 に答える
1

口述の場合、フラスコはそれを直接返すことができます(バージョン1.0.2)

def summary():
    d = make_summary()
    return d, 200
于 2019-12-03T14:15:15.943 に答える
0

オブジェクトをシリアル化するには、jsonifyfromflaskモジュールを使用してオブジェクトをjsonifyします。デフォルトでは、辞書がシリアル化されます。また、ファイルを扱っている場合は、いつでもを使用できますmake_response

于 2021-11-12T10:49:35.727 に答える
-2

私はこのように好きです:

    @app.route("/summary")
    def summary():
        responseBody = { "message": "bla bla bla", "summary": make_summary() }
        return make_response(jsonify(responseBody), 200)
于 2020-09-16T13:58:58.930 に答える