Вернуть JSON ответ с видом колбу



У меня есть функция, которая анализирует CSV-файл с пандами и создает dict с суммарной информацией. Я хочу вернуть результаты в качестве ответа из представления колбы. Как я могу вернуть JSON ответ?



@app.route("/summary")
def summary():
d = make_summary()
# send it back as json
592   8  

8 ответов:

передайте сводные данные в 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 делает путем построения ответа с 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 и передать его в функцию.

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

вы можете написать декоратор для преобразования возвращаемого значения из функции представления в 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)

Comments

    Ничего не найдено.