Cómo crear una API REST con Flask en Ubuntu

Introducción

En este tutorial, aprenderá a crear una API REST simple utilizando Flask, un marco web ligero de Python. cubriremos los conceptos básicos para configurar una aplicación de Flask, definir rutas, manejar solicitudes y devolver respuestas en formato JSON. Al finalizar este tutorial, tendrá funcionando una API que podrá ampliar y integrar con otras aplicaciones.

Prerrequisitos

  • Un servidor que ejecute Ubuntu y un usuario no root con privilegios de sudo y una cortina activa. Para obtener instrucciones sobre cómo configurar esto, por favor elija su distribución de esta lista y siga nuestra guía de configuración inicial del servidor. Asegúrese de trabajar con una versión compatible de Ubuntu.

  • Familiaridad con la línea de comandos de Linux. Para una introducción o recuerdo de la línea de comandos, puede visitar esta guía sobre primer curso de la línea de comandos de Linux

  • Un entendimiento básico de la programación en Python.

  • Python 3.7 o posterior instalado en su sistema Ubuntu. Para aprender cómo ejecutar un script de Python en Ubuntu, puede referirse a nuestro tutorial sobre cómo ejecutar un script de Python en Ubuntu.

Paso 1 — Configuración de tu Entorno Flask

Ubuntu 24.04 trae Python 3 por defecto. Abra el terminal y ejecute el siguiente comando para comprobar la instalación de Python 3:

root@ubuntu:~# python3 --version
Python 3.12.3

Si Python 3 ya está instalado en su equipo, el comando anterior devuelve la versión actual de la instalación de Python 3. En caso de que no esté instalado, puede ejecutar el siguiente comando para obtener la instalación de Python 3:

root@ubuntu:~# sudo apt install python3

Después, necesita instalar el instalador de paquetes pip en su sistema:

root@ubuntu:~# sudo apt install python3-pip

Una vez que pip está instalado, vamos a instalar Flask.

Vas a instalar Flask mediante pip. Es recomendable hacer esto en un entorno virtual para evitar conflictos con otros paquetes en tu sistema.

root@ubuntu:~# python3 -m venv myprojectenv
root@ubuntu:~# source myprojectenv/bin/activate
root@ubuntu:~# pip install Flask

Paso 2 – Crear una Aplicación de Flask

El siguiente paso es escribir el código de Python para la aplicación de Flask. Para crear un nuevo archivo, navegue hasta el directorio de su elección:

root@ubuntu:~# cd ~/path-to-your-script-directory

Una vez dentro del directorio, cree un nuevo archivo Python, app.py, e importe Flask. A continuación, inicie una aplicación de Flask y cree una ruta básica.

root@ubuntu:~# nano app.py

Esto abrirá un editor de texto en blanco. Escriba su lógica aquí o copie el siguiente código:

app.py
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify(message="Hello, World!")

# In-memory data store
items = [{"id": 1, "name": "This is item 1"}, {"id": 2, "name": "This is item 2"}]

Paso 3 – Creando Rutas RESTful

En esta sección, definiremos rutas en nuestra aplicación de Flask que corresponden a las diferentes acciones que un usuario puede realizar en la API. Cada ruta manejará un método HTTP específico.

GET, POST, PUT, y DELETE. Estos métodos corresponden a las cuatro operaciones básicas de almacenamiento persistente, a menudo se refieren como CRUD (Create, Read, Update, Delete).

Agregue las siguientes rutas a su archivo de script de Python app.py:

app.py
from flask import Flask, jsonify, request

app = Flask(__name__)

@app.route('/')
def hello_world():
    return jsonify(message="Hello, World!")

# Almacén de datos en memoria
items = [{"id": 1, "name": "This is item 1"}, {"id": 2, "name": "This is item 2"}]

# Solicitud GET: Recuperar todos los elementos
@app.route('/api/items', methods=['GET'])
def get_items():
    return jsonify(items)

# Solicitud GET: Recuperar un elemento específico por ID
@app.route('/api/items/<int:item_id>', methods=['GET'])
def get_item(item_id):
    item = next((item for item in items if item["id"] == item_id), None)
    if item is None:
        return jsonify({"error": "Item not found"}), 404
    return jsonify(item)

# Solicitud POST: Crear un nuevo elemento
@app.route('/api/items', methods=['POST'])
def create_item():
    new_item = {"id": len(items) + 1, "name": request.json.get('name')}
    items.append(new_item)
    return jsonify(new_item), 201

# Solicitud PUT: Actualizar un elemento existente
@app.route('/api/items/<int:item_id>', methods=['PUT'])
def update_item(item_id):
    item = next((item for item in items if item["id"] == item_id), None)
    if item is None:
        return jsonify({"error": "Item not found"}), 404
    item['name'] = request.json.get('name', item['name'])
    return jsonify(item)

# Solicitud DELETE: Eliminar un elemento
@app.route('/api/items/<int:item_id>', methods=['DELETE'])
def delete_item(item_id):
    global items
    items = [item for item in items if item["id"] != item_id]
    return '', 204

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

Vamos a saber más acerca de lo que hace cada función:

  • Importaciones de Flask: El código importa componentes necesarios de Flask: Flask, jsonify, y request.

  • Almacén de Datos en Memoria: items es una simple lista de diccionarios que actúa como un almacén de datos temporal para la API. Cada elemento tiene un id y un name.

  • GET /api/items: Cuando se realiza una solicitud GET a /api/items, el servidor devuelve una lista de todos los elementos en el almacén de datos de elementos. Esto es útil para recuperar todos los recursos de una colección.

  • POST /api/items: Una solicitud POST a /api/items permite al cliente crear un nuevo elemento. El servidor espera un objeto JSON que contenga los detalles del nuevo elemento en el cuerpo de la solicitud. Después de crear el elemento, el servidor responde con el elemento recién creado y un código de estado 201 Created.

  • PUT /api/items/<int:item_id>: Una solicitud PUT a /api/items/<item_id> se utiliza para actualizar un elemento existente con el item_id especificado. El cliente envía los datos actualizados en el cuerpo de la solicitud, y el servidor modifica el elemento existente. Si no se encuentra el elemento, el servidor devuelve un error 404 Not Found.

  • DELETE /api/items/<int:item_id>: Una solicitud DELETE a /api/items/<item_id> elimina el elemento con el item_id especificado de la tienda de datos. Si el elemento se elimina con éxito, el servidor responde con un código de estado 204 No Content, indicando que la eliminación fue exitosa y no hay más contenido para devolver.

  • Running the Application: El bloque if __name__ == "__main__": asegura que la aplicación Flask se ejecute cuando el script se ejecuta directamente.

Paso 4 — Ejecución y prueba de tu API

Empieza tu servidor Flask utilizando el siguiente comando:

root@ubuntu:~# python3 app.py

Deberías notar que el servidor Flask se está ejecutando con la salida siguiente:

Output
* Serving Flask app 'app' * Debug mode: on WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead. * Running on http://127.0.0.1:5000 Press CTRL+C to quit * Restarting with stat * Debugger is active! * Debugger PIN: 837-877-972

Apartir de la salida anterior, puedes notar que el servidor se está ejecutando en http://127.0.0.1 y está escuchando en el puerto 5000.

Ahora, puedes probar las entradas utilizando curl, Postman, o otro cliente HTTP. En este tutorial, utilizarás curl para probar las entradas y enviar solicitudes HTTP.

Abra otra consola de Ubuntu y ejecute los siguientes comandos curl uno por uno:

  • GET: curl http://127.0.0.1:5000/api/items
  • POST: curl -X POST -H "Content-Type: application/json" -d '{"name": "This is item 3"}' http://127.0.0.1:5000/api/items
  • PUT: curl -X PUT -H "Content-Type: application/json" -d '{"name": "This is updated item 1"}' http://127.0.0.1:5000/api/items/1
  • DELETE: curl -X DELETE http://127.0.0.1:5000/api/items/1

Veamos cada uno de estos comandos en acción:

root@ubuntu:~# curl http://127.0.0.1:5000/api/items
Output
[ { "id": 1, "name": "This is item 1" }, { "id": 2, "name": "This is item 2" } ]

Usted notará que el servidor devuelve una lista de todos los elementos en el almacén de datos de items.

Usando el método POST, vamos a agregar un nuevo elemento al almacén de datos.

root@ubuntu:~# curl -X POST -H "Content-Type: application/json" -d '{"name": "This is item 3"}' http://127.0.0.1:5000/api/items
Output
{ "id": 3, "name": "This is item 3" }

Nota: En su otra consola donde su servidor Flask está ejecutándose, notará que se están ejecutando todas las solicitudes HTTP y sus códigos de respuesta también.

* Running on http://127.0.0.1:5000
Press CTRL+C to quit
 * Restarting with stat
 * Debugger is active!
 * Debugger PIN: 837-877-972
127.0.0.1 - - [23/Aug/2024 06:57:27] "GET /api/items HTTP/1.1" 200 -
127.0.0.1 - - [23/Aug/2024 06:59:56] "POST /api/items HTTP/1.1" 201 -

Esta es una gran manera de monitorear, depurar y resolver problemas con el servidor.

Ahora, vamos a ejecutar una solicitud PUT. Una solicitud PUT a /api/items/<item_id> actualizará un elemento existente con el item_id especificado.

root@ubuntu:~# curl -X PUT -H "Content-Type: application/json" -d '{"name": "This is updated item 1"}' http://127.0.0.1:5000/api/items/1
Output
{ "id": 1, "name": "This is updated item 1" }

Ahora, ejecute una solicitud GET para ver el elemento actualizado 1.

root@ubuntu:~# curl http://127.0.0.1:5000/api/items/1
Output
{ "id": 1, "name": "This is updated item 1" }

Por último, ejecute una solicitud DELETE para eliminar un elemento del almacén de datos.

root@ubuntu:~# curl -X DELETE http://127.0.0.1:5000/api/items/1

Esto eliminará el elemento 1 del almacén de datos.

Para verificar esto, ejecute una solicitud GET.

root@ubuntu:~# curl http://127.0.0.1:5000/api/items
Output
[ { "id": 2, "name": "This is item 2" }, { "id": 3, "name": "This is item 3" } ]

Notará que el elemento 1 ya no está presente y ha sido eliminado permanentemente.

Conclusión

En este tutorial, ha creado una aplicación básica de API REST utilizando Flask. Ahora puede ampliar esta API con rutas adicionales, integrarla con una base de datos o desplegarla en una plataforma en la nube como DigitalOcean. Flask es una herramienta poderosa para construir APIs de forma rápida y eficiente, y con estos conceptos básicos, ya está listo para comenzar a construir aplicaciones más complejas.

Source:
https://www.digitalocean.com/community/tutorials/create-a-rest-api-using-flask-on-ubuntu