Возврат ответа 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)