Повернути відповідь JSON з вікна колби


464

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

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

Відповіді:


752

Передайте підсумкові дані jsonifyфункції, яка повертає відповідь JSON.

from flask import jsonify

@app.route('/summary')
def summary():
    d = make_summary()
    return jsonify(d)

Станом на Flask 0,11, ви можете передавати будь-який тип JSON-серіалізації, а не просто диктант, як об'єкт верхнього рівня.


4
Станом на Flask 1.1.0 , тепер ви можете безпосередньо повернути діктову пітона, і він буде автоматично jsonify'd Flask.
Адріан Бал

203

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

129

Передайте аргументи ключових слів 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(d).


Відповідно до приміток до випуску 1.1.0 , Flask дозволяє повертати словник з функції перегляду. Подібно до того, як повернення рядка призведе до тексту / html-відповіді, повернення дикту викликає jsonify для отримання відповіді на додаток / json,
CodeMantle

34

Якщо ви не хочете користуватися 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.jsonвідрізняється від вбудованого jsonмодуля. Він буде використовувати швидший simplejsonмодуль, якщо він є, і дозволяє різні інтеграції з вашим додатком Flask.


17

Якщо ви хочете проаналізувати файл, завантажений користувачем, швидкий старт Flask показує, як отримати файли від користувачів та отримати доступ до них. Отримайте файл 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 формі.


13

Щоб повернути відповідь JSON та встановити код статусу, ви можете використовувати make_response:

from flask import jsonify, make_response

@app.route('/summary')
def summary():
    d = make_summary()
    return make_response(jsonify(d), 200)

Натхнення, взяте з цього коментаря, у трекері випуску Flask.



10

Я використовую декоратор, щоб повернути результат jsonfiy. Я думаю, що це зручніше читати, коли представлення має кілька повернень. Це не підтримує повернення кортежу на кшталт content, status, але я обробляю статуси помилок повернення за допомогою app.errorhandler.

import functools
from flask import jsonify

def return_json(f):
    @functools.wraps(f)
    def inner(**kwargs):
        return jsonify(f(**kwargs))

    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 'none of them'

4

До 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)

2

У Flask 1.1, якщо ви повернете словник, він автоматично перетвориться на JSON. Тож якщо make_summary()повертає словник, ви можете

from flask import Flask

app = Flask(__name__)

@app.route('/summary')
def summary():
    d = make_summary()
    return d

SO , який просить про включення код стану був закритий в двох примірниках на цей. Отже, щоб також відповісти на це запитання, ви можете включити код статусу, повернувши кордону форми (dict, int). dictПеретвориться в формат JSON і intбуде HTTP Status Code. Без будь-якого вводу Статус - це стандартний 200. Отже, у наведеному вище прикладі код буде 200. У наведеному нижче прикладі він змінюється на 201.

from flask import Flask

app = Flask(__name__)

@app.route('/summary')
def summary():
    d = make_summary()
    return d, 201  # 200 is the default

Ви можете перевірити код статусу за допомогою

curl --request GET "http://127.0.0.1:5000/summary" -w "\ncode: %{http_code}\n\n"

0

якщо його дикт, колба може повернути його безпосередньо (версія 1.0.2)

def summary():
    d = make_summary()
    return d, 200

0

"" " Використання перегляду базового класу " ""

from flask import Flask, request, jsonify

from flask.views import MethodView

app = Flask(**__name__**)

app.add_url_rule('/summary/', view_func=Summary.as_view('summary'))

class Summary(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)

0

Колба 1.1.x

тепер запит підтримки Flask повертається безпосередньо з json, jsonify більше не потрібен

@app.route("/")
def index():
    return {
        "api_stuff": "values",
    }

еквівалентно

@app.route("/")
def index():
    return jsonify({
        "api_stuff": "values",
    })

для отримання додаткової інформації читайте тут https://medium.com/octopus-wealth/returning-json-from-flask-cf4ce6fe9aeb та https://github.com/pallets/flask/pull/3111

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.