У меня есть функция, которая анализирует CSV-файл с помощью Pandas и выдает dict с итоговой информацией. Я хочу вернуть результаты в виде ответа из представления 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, вы можете передавать любой JSON-сериализуемый тип, а не только dict, в качестве объекта верхнего уровня.
jsonify
сериализует данные вы передаете его в JSON. Если вы хотите сериализовать данные о себе, делать то, что jsonify
не построив ответ со статусом=200и
тип='приложение/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)
.
Если вы Don'т хотите использовать jsonify
по какой-то причине, вы можете сделать это вручную. Зову флягу.в JSON.дампы для создания JSON-данных, а затем возвращает ответ С тип содержимого приложение/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
фляга.формат JSON
отличается от встроенной модуля JSON. Он будет использовать модуль быстрой
пакет` если, и позволяет различные интеграции с вашим приложением флягу.
Если вы хотите проанализировать файл, загруженный пользователем, во Flask quickstart показано, как получить файлы от пользователей и получить к ним доступ. Получите файл из 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-это простой в использовании, но я предпочитаю использовать декоратора, чтобы вернуть в формате JSON. Это помогает возвращает любой тип данных JSON и более читабельные, когда у вас есть несколько возвращает в ваш метод. (обратите внимание, что этот пример работает на 200 ответов, я возвращать ошибки с воспитанием исключения и флягу.файле errorhandler
)
def return_json(f):
@functools.wraps(f)
def inner(*a, **k):
return json.dumps(f(*a, **k))
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 'non of them'
Чтобы вернуть ответ в формате JSON и установить код состояния вы можете использовать make_response
:
from flask import jsonify, make_response
@app.route('/summary')
def summary():
d = make_summary()
return make_response(jsonify(d), 200)
Вдохновение взято из комментария в вопросе фляга трекер.
До склянки 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
из фляжки.вид импорт MethodView
приложение = фляга(имя)
приложение.add_url_rule('/резюме/', view_func=резюме.as_view('резюме'))
класса резюме(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)