Devolver una respuesta JSON válida en Flask

Salman Mehmood 15 febrero 2024
Devolver una respuesta JSON válida en Flask

Aprenderemos, con esta explicación, sobre la compatibilidad con JSON en Flask y cómo crear una API y devolverla en respuesta JSON con la ayuda de jsonify() en Flask.

Devolver una respuesta JSON válida con la ayuda de jsonify() en Flask

Si bien usar JSON con Flask es bastante simple porque el tipo del objeto JSON se puede asignar a los tipos de Python y podemos acceder a él como un diccionario o una matriz. Si está familiarizado con los conceptos básicos de JSON, entonces debería poder entender esto.

Ahora necesitaremos configurar una aplicación Flask. Solo estamos haciendo algunas cosas básicas para crear una aplicación y luego crearemos una ruta única.

Especificaremos una raíz para el método Get_Trucks() que es route('truck/api/',methods=['GET']) dentro del decorador. Y dentro del método Get_Trucks(), declararemos una lista de diccionarios que se llama Trucks y la devolveremos directamente.

@app.route("truck/api/", methods=["GET"])
def Get_Trucks():
    Trucks = [
        {"id": 1, "year": 2017, "model": ""},
        {"id": 2, "year": 2019, "model": ""},
        {"id": 3, "year": 2020, "model": ""},
        {"id": 4, "year": 2016, "model": ""},
    ]
    return Trucks

Ahora, veremos dos casos: el primero devuelve una matriz de objetos y el segundo solo devuelve un objeto por sí mismo o un diccionario.

Sigamos adelante y echemos un vistazo al segundo. El código será el mismo excepto por una función llamada Truck_Details().

from flask import Flask

app = Flask(__name__)


@app.route("/truck/api/", methods=["GET"])
def Get_Trucks():
    Trucks = [
        {"id": 1, "year": 2017, "model": ""},
        {"id": 2, "year": 2019, "model": ""},
        {"id": 3, "year": 2020, "model": ""},
        {"id": 4, "year": 2016, "model": ""},
    ]
    return Trucks


@app.route("/truck-details/api/", methods=["GET"])
def Truck_Details():
    Details = {"id": 2, "year": 2019, "model": ""}
    return Details


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

Ahora, ejecutaremos la aplicación Flask e iremos al navegador. Probemos esta primera ruta.

Cuando presionamos Enter, obtenemos el tipo de error donde podemos leer que la función ver no devolvió una respuesta válida porque estamos tratando de enviar una lista de Python al navegador.

Flask Retorno JSON Salida 1

Podemos arreglar esto muy rápidamente importando una cosa más de Flask: ‘jsonify()’. Este es un Flask incorporado; no necesitamos usar un módulo de terceros.

Iremos a donde estamos devolviendo nuestra lista o matriz y la envolveremos en jsonify(). Guardemos esto y probemos nuestra ruta nuevamente, y ahora estamos obteniendo una respuesta JSON válida.

Si observamos esto en el inspector de red, podemos ver que tiene un tipo de contenido de aplicación JSON.

Flask Retorno JSON Salida 2

Veamos cómo devolver un solo objeto desde Flask sin usar jsonify(). Echémosle un vistazo en el navegador.

Funciona porque estamos usando una versión mejorada. Si usa Flask versión 1.1.0 o superior, convertirá automáticamente el diccionario a JSON cuando lo devuelva en una view, pero si su versión de Flask es inferior a 1.1.0, puede hacer lo siguiente. Lo mismo que hicimos para devolver varios objetos.

Si observamos el lado derecho, podemos ver que el tipo de contenido es JSON, y solo estamos usando una extensión de Chrome llamada vista JSON para embellecer los datos de respuesta.

Flask Retorno JSON Salida 3

Código fuente completo:

from flask import Flask, jsonify

app = Flask(__name__)


@app.route("/truck/api/", methods=["GET"])
def Get_Trucks():
    Trucks = [
        {"id": 1, "year": 2017, "model": ""},
        {"id": 2, "year": 2019, "model": ""},
        {"id": 3, "year": 2020, "model": ""},
        {"id": 4, "year": 2016, "model": ""},
    ]
    return jsonify(Trucks)


@app.route("/truck-details/api/", methods=["GET"])
def Truck_Details():
    Details = {"id": 2, "year": 2019, "model": ""}
    return Details


if __name__ == "__main__":
    app.run(debug=True)
Salman Mehmood avatar Salman Mehmood avatar

Hello! I am Salman Bin Mehmood(Baum), a software developer and I help organizations, address complex problems. My expertise lies within back-end, data science and machine learning. I am a lifelong learner, currently working on metaverse, and enrolled in a course building an AI application with python. I love solving problems and developing bug-free software for people. I write content related to python and hot Technologies.

LinkedIn