PandasでCSVファイルを解析して要約情報付きの辞書を作成する機能があります。 Flaskビューからの応答として結果を返したいです。 JSONレスポンスを返すにはどうすればいいですか?
@app.route("/summary")
def summary():
d = make_summary()
# send it back as json
要約データを jsonify
関数に渡して、JSON応答を返します。
from flask import jsonify
@app.route('/summary')
def summary():
d = make_summary()
return jsonify(d)
Flask 0.11から、あなたはトップレベルのオブジェクトとしてdictだけではなく、どんなJSONシリアライズ可能な型でも渡すことができます。
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
}
何らかの理由で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 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フォームに入力されたファイルの名前に置き換えます。
ビュー関数からの戻り値を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'
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)
Jsonified応答、andステータスコードを返すには、次のようにします。
from flask import jsonify, make_response
@app.route('/summary')
def summary():
d = make_summary()
return make_response(jsonify(d), 200)
フラスコに対するこの bug からのインスピレーション
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)
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)