PandasでCSVファイルを分析し、要約情報を含むdictを生成する機能があります。Flaskビューからの応答として結果を返したいです。JSON応答を返すにはどうすればよいですか?
@app.route("/summary")
def summary():
d = make_summary()
# send it back as json
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)
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
キーワード引数をに渡す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)
。
何らかの理由で使用したくない場合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アプリとのさまざまな統合を可能にします。
JSON応答を返し、ステータスコードを設定するには、次を使用できますmake_response
。
from flask import jsonify, make_response
@app.route('/summary')
def summary():
d = make_summary()
return make_response(jsonify(d), 200)
FlaskIssueTrackerのこのコメントからインスピレーションを得ました。
バージョン1.1.0Flaskの時点で、ビューがdictを返す場合、それはJSON応答に変換されます。
@app.route("/users", methods=['GET'])
def get_user():
return {
"user": "John Doe",
}
ユーザーがアップロードしたファイルを分析する場合、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フォームに入力されたファイルの名前に置き換えます。
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
デコレータを使用して、の結果を返し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'
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)
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)
。はdict
JSONに変換され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"
答えは、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'))
口述の場合、フラスコはそれを直接返すことができます(バージョン1.0.2)
def summary():
d = make_summary()
return d, 200
オブジェクトをシリアル化するには、jsonify
fromflask
モジュールを使用してオブジェクトをjsonifyします。デフォルトでは、辞書がシリアル化されます。また、ファイルを扱っている場合は、いつでもを使用できますmake_response
。
私はこのように好きです:
@app.route("/summary")
def summary():
responseBody = { "message": "bla bla bla", "summary": make_summary() }
return make_response(jsonify(responseBody), 200)