Возврат ответа JSON из представления колбы
У меня есть функция, которая анализирует CSV-файл с пандами и создает dict с суммарной информацией. Я хочу вернуть результаты в качестве ответа из представления колбы. Как вернуть ответ JSON?
@app.route("/summary")
def summary():
d = make_summary()
# send it back as json
8 ответов
передайте сводные данные в jsonify
функция, которая возвращает JSON ответ.
from flask import jsonify
@app.route('/summary')
def summary():
d = make_summary()
return jsonify(d)
начиная с колбы 0.11, вы можете передать любой JSON-сериализуемый тип, а не только dict, как объект верхнего уровня.
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
}
если вы хотите проанализировать файл, загруженный пользователем, колба краткое руководство показывает, как получить файлы от пользователей и получить к ним доступ. Получить файл из 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-форму.
если вы не хотите использовать 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
вы можете написать декоратор, чтобы преобразовать возвращаемое значение из функции view в ответ 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'
до колбы 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)
Как сказано ранее, jsonify-лучший способ, или вы также можете использовать фляга-ответы' пакет в https://github.com/Parkayun/flask-responses
@app.route("/json")
def hello():
return json_response(your_dict, status_code=201)