python request - Devuelve la respuesta JSON desde la vista de Flask




api response (8)

Puede escribir un decorador para convertir el valor de retorno de una función de vista en una respuesta 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'

Tengo una función que analiza un archivo CSV con Pandas y produce un dict con información resumida. Quiero devolver los resultados como una respuesta de una vista de Flask. ¿Cómo devuelvo una respuesta JSON?

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

jsonify serializa los datos que le pasas a JSON. Si desea serializar los datos usted mismo, haga lo que jsonify construyendo una respuesta con status=200 y 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

Como dije anteriormente, jsonify es la mejor manera o también puede usar el paquete Flask- answers en https://github.com/Parkayun/flask-responses

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

Pase los datos de resumen a la función jsonify , que devuelve una respuesta JSON.

from flask import jsonify

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

A partir del Flask 0.11, puede pasar cualquier tipo serializable JSON, no solo dict, como el objeto de nivel superior.


Si desea analizar un archivo cargado por el usuario, el quickstart Flask muestra cómo obtener archivos de los usuarios y acceder a ellos. Obtenga el archivo de request.files y páselo a la función de resumen.

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')

Reemplace la clave 'data' de request.files con el nombre del archivo ingresado en su formulario HTML.


Antes de Flask 0.11, jsonfiy no permitía devolver una matriz directamente. En su lugar, pase la lista como un argumento de palabra clave.

@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)

Pase los argumentos de palabras clave a jsonify y se mostrarán como un objeto 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
}

No tengo suficiente reputación para agregar comentarios, así que simplemente escribo algunos de mis descubrimientos de este molesto TypeError aquí:

Básicamente, creo que es un error en la función json.dump() en Python 2 solamente. No puede volcar datos de Python (diccionario / lista) que contengan caracteres no ASCII, incluso si abre el archivo con encoding = 'utf-8' parámetro. (Es decir, no importa lo que hagas). Pero, json.dumps() funciona tanto en Python 2 como en 3.

Para ilustrar esto, siga la respuesta de phihag: el código en su respuesta se interrumpe en Python 2 con la excepción TypeError: must be unicode, not str , si los data contienen caracteres no ASCII. (Python 2.7.6, Debian):

import json
data = {u'\u0430\u0431\u0432\u0433\u0434': 1} #{u'абвгд': 1}
with open('data.txt', 'w') as outfile:
    json.dump(data, outfile)

Sin embargo, funciona bien en Python 3.







python json flask