Возвращение ответа JSON из представления "Флажок"

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

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

Ответ 1

Передайте сводные данные в функцию jsonify, которая возвращает ответ JSON.

from flask import jsonify

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

Как и Flask 0.11, вы можете передать любой тип JSON-сериализуемого типа, а не только dict, как объект верхнего уровня.

Ответ 2

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

Ответ 3

Передайте аргументы ключевого слова в 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": "[email protected]",
    "id": 42
}

Если у вас уже есть dict, вы можете передать его напрямую как jsonify(d).

Ответ 4

Если вы по какой-то причине не хотите использовать 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 модуль simplejson если он доступен, и разрешает различные интеграции с вашим приложением Flask.

Ответ 5

Если вы хотите проанализировать файл, загруженный пользователем, в быстром запуске 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-форму.

Ответ 6

Хотя flask.jsonify прост в использовании, но я предпочитаю использовать декоратор для возврата json. Это помогает возвращать любой тип json и более читабельно, когда в вашем методе есть несколько возвратов. (обратите внимание, что этот пример работает для 200 ответов, я возвращаю ошибки с повышением исключений и Flask.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'

Ответ 7

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

Ответ 8

Чтобы вернуть JSON-ответ и установить код состояния, вы можете вернуть кортеж:

from flask import jsonify, make_response

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

Вдохновение взято из этого комментария в трекере вопросов Flask.

Ответ 9

Если вам нужно вернуть JSON для реализации REST API, вы можете использовать Flask-Restful.

from flask import Flask
from flask_restful import Resource, Api

app = Flask(__name__)
api = Api(app)

class HelloWorld(Resource):
    def get(self):
        return {'hello': 'world'}

api.add_resource(HelloWorld, '/')

if __name__ == '__main__':
    app.run(debug=True)

Ответ 10

Python Flask JSON:

from flask import Flask, jsonify,request,json


app = Flask(__name__)



country = [
            {'name':'india'},
            {'name':'pakistian'},
            {'name':'US'},
            {'name':'UK'},
            {'name':'NZ'}
            ]


@app.route('/', methods=['GET'])
def test():

    return jsonify({
        'message': 'Hai'
    })



@app.route('/country', methods=['GET'])
def countryall():

    return jsonify({

        'country':country
    })


if __name__ == '__main__':
    app.run(debug=True, port=8080)

Ответ 11

Как сказано ранее, jsonify является лучшим способом или вы также можете использовать пакет Flask-response "на https://github.com/Parkayun/flask-responses

@app.route("/json")
def hello():
    return json_response(your_dict, status_code=201)

Ответ 12

Вы можете попробовать этот подход:

from flask import jsonify, Flask

app = Flask(__name__)

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