FlaskビューからJSON応答を返す


464

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

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

回答:


753

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

from flask import jsonify

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

Flask 0.11以降では、dictだけでなく、JSONでシリアル化可能な任意の型を最上位オブジェクトとして渡すことができます。


4
とおりフラスコ1.1.0、あなたは今、直接Pythonの辞書を返すことができ、それが自動的にフラスコでjsonify'dされます。
エイドリアンボール

203

jsonifyJSONに渡すデータをシリアル化します。自分でデータをシリアル化する場合はjsonifystatus=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

129

キーワード引数をに渡す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
}

すでに辞書がある場合は、直接として渡すことができますjsonify(d)


1
1.1.0リリースノートに従って、Flaskはビュー関数から辞書を返すことができます。文字列を返すことは、辞書を返すことはアプリケーション/ JSONレスポンスを生成するためにjsonify呼び出します、text / htmlの応答を生成する方法と同様に
CodeMantle

34

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.json組み込みjsonモジュールとは異なります。simplejson可能な場合はより高速なモジュールを使用し、Flaskアプリとのさまざまな統合を可能にします。


17

ユーザーがアップロードしたファイルを分析する場合、Flask クイックスタートはユーザーからファイルを取得してアクセスする方法を示します。からファイルを取得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フォームに入力されたファイルの名前に置き換えます。


13

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

from flask import jsonify, make_response

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

Flask Issue Trackerのこのコメントからのインスピレーション。



10

デコレータを使用しての結果を返し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'

4

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)

2

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に変換され、intHTTPステータスコードになります。入力がない場合、ステータスはデフォルトの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"

0

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

def summary():
    d = make_summary()
    return d, 200

0

"" " Flaskクラスベースビュー " ""の使用

from flask import Flask, request, jsonify

from flask.views import MethodView

app = Flask(**__name__**)

app.add_url_rule('/summary/', view_func=Summary.as_view('summary'))

class Summary(MethodView):

    def __init__(self):
        self.response = dict()

    def get(self):
        self.response['summary'] = make_summary()  # make_summary is a method to calculate the summary.
        return jsonify(self.response)

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.