Construir APIs RESTful es una habilidad fundamental para el desarrollo web moderno, que permite una comunicación fluida entre clientes y servidores. Flask-RESTX, una extensión del popular framework Flask, simplifica este proceso proporcionando herramientas para crear APIs robustas de manera eficiente. En este tutorial, exploraremos cómo construir una API RESTful usando Flask-RESTX y demostraremos cómo probarla con Apidog, una plataforma integrada para el diseño de APIs, depuración, documentación, mocking y testing.
1. Introducción a las APIs RESTful
REST (Representational State Transfer) es un estilo arquitectónico que utiliza métodos HTTP estándar para interactuar con los recursos. Las APIs que se adhieren a los principios REST se denominan APIs RESTful. Proporcionan una interfaz predecible y uniforme para las interacciones cliente-servidor, lo que hace que los servicios web sean más accesibles y fáciles de mantener.
2. Configuración de tu entorno de desarrollo
Antes de empezar a construir nuestra API, configuremos nuestro entorno de desarrollo.
Prerrequisitos
Python 3.7 o superior: Asegúrate de que Python esté instalado en tu sistema. Verifícalo ejecutando:
python --version
Entorno Virtual: Es una buena práctica crear un entorno virtual para tu proyecto para gestionar las dependencias.
python -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
Instalación de Flask y Flask-RESTX
Con el entorno virtual activado, instala Flask y Flask-RESTX usando pip:
pip install flask flask-restx
Este comando instala tanto Flask como Flask-RESTX, lo que nos permite construir y gestionar nuestros endpoints de API de manera efectiva.
3. Instalación y configuración de Flask-RESTX
Flask-RESTX es una extensión que añade soporte para construir rápidamente APIs REST con Flask. Fomenta las mejores prácticas con una configuración mínima.

Instalación
Si aún no has instalado Flask-RESTX, puedes hacerlo usando pip:
pip install flask-restx
Configuración
Crea un nuevo archivo Python, por ejemplo, app.py
, y configura la configuración básica:
from flask import Flask
from flask_restx import Api
app = Flask(__name__)
api = Api(app, version='1.0', title='Sample API',
description='A sample API using Flask-RESTX')
if __name__ == '__main__':
app.run(debug=True)
Este script inicializa una aplicación Flask y la envuelve con una instancia de API Flask-RESTX, proporcionando una base para construir endpoints.
4. Creación de tu primer endpoint de API
Creemos un endpoint simple para entender cómo funciona Flask-RESTX.
Definición de un Namespace
Los Namespaces en Flask-RESTX ayudan a organizar tu API y a prevenir colisiones de nombres de endpoints.
from flask_restx import Namespace, Resource
ns = Namespace('hello', description='Hello World operations')
Creación de un Recurso
Los Recursos en Flask-RESTX corresponden a endpoints y definen cómo se manejan los métodos HTTP.
@ns.route('/')
class HelloWorld(Resource):
def get(self):
return {'message': 'Hello, World!'}
Registro del Namespace
Finalmente, registra el namespace con la API:
api.add_namespace(ns)
Ahora, cuando ejecutes tu aplicación y navegues a http://localhost:5000/hello/
, deberías ver:
{
"message": "Hello, World!"
}
5. Estructuración de tu aplicación Flask-RESTX
A medida que tu aplicación crece, es esencial mantener una estructura limpia y organizada.
Diseño de Proyecto Recomendado
project/
├── app/
│ ├── __init__.py
│ ├── controllers/
│ │ ├── __init__.py
│ │ └── hello_controller.py
│ ├── models/
│ │ ├── __init__.py
│ │ └── hello_model.py
│ └── services/
│ ├── __init__.py
│ └── hello_service.py
├── run.py
└── requirements.txt
Inicialización de la Aplicación
En app/__init__.py
:
from flask import Flask
from flask_restx import Api
def create_app():
app = Flask(__name__)
api = Api(app, version='1.0', title='Sample API',
description='A sample API using Flask-RESTX')
from .controllers.hello_controller import ns as hello_namespace
api.add_namespace(hello_namespace)
return app
En run.py
:
from app import create_app
app = create_app()
if __name__ == '__main__':
app.run(debug=True)
Este enfoque modular separa las preocupaciones, haciendo que la aplicación sea más fácil de mantener y escalar.
6. Implementación de Operaciones CRUD
Las operaciones CRUD (Crear, Leer, Actualizar, Eliminar) son fundamentales para el desarrollo de APIs. Implementemos estas para un recurso Item
simple.
Definición del Modelo
En app/models/item_model.py
:
from flask_restx import fields
def get_item_model(api):
return api.model('Item', {
'id': fields.Integer(readOnly=True, description='The unique identifier of an item'),
'name': fields.String(required=True, description='Item name'),
'price': fields.Float(required=True, description='Item price')
})
Implementación del Recurso
En app/controllers/item_controller.py
:
from flask_restx import Namespace, Resource, reqparse
from app.models.item_model import get_item_model
ns = Namespace('items', description='Item operations')
item_model = get_item_model(ns)
items = []
item_id_counter = 1
parser = reqparse.RequestParser()
parser.add_argument('name', type=str, required=True, help='Name of the item')
parser.add_argument('price', type=float, required=True, help='Price of the item')
@ns.route('/')
class ItemList(Resource):
@ns.marshal_list_with(item_model)
def get(self):
return items
@ns.expect(item_model)
@ns.marshal_with(item_model, code=201)
def post(self):
global item_id_counter
args = parser.parse_args()
item = {
'id': item_id_counter,
'name': args['name'],
'price': args['price']
}
items.append(item)
item_id_counter += 1
return item, 201
@ns.route('/<int:id>')
@ns.response(404, 'Item not found')
@ns.param('id', 'The item identifier')
class Item(Resource):
@ns.marshal_with(item_model)
def get(self, id):
item = next((item for item in items if item['id'] == id), None)
if item is not None:
return item
ns.abort(404, message="Item not found")
@ns.expect(item_model)
@ns.marshal_with(item_model)
def put(self, id):
item = next((item for item in items if item['id'] == id), None)
if item is not None:
args = parser.parse_args()
item.update({
'name': args['name'],
'price': args['price']
})
return item
ns.abort(404, message="Item not found")
@ns.response(204, 'Item deleted')
def delete(self, id):
global items
item = next((item for item in items if item['id'] == id), None)
if item is not None:
items = [item for item in items if item['id'] != id]
return '', 204
ns.abort(404, message="Item not found")
En esta implementación:
- GET /items/: Recupera la lista de elementos.
- POST /items/: Agrega un nuevo elemento.
- GET /items/{id}: Recupera un elemento específico por ID.
- PUT /items/{id}: Actualiza un elemento existente por ID.
- DELETE /items/{id}: Elimina un elemento por ID.
Esta configuración proporciona una interfaz CRUD completa para gestionar elementos en tu API.
7. Validación y Serialización de Datos con Flask-RESTX
La validación y serialización de datos son cruciales para garantizar la integridad y consistencia de los datos que procesa tu API. Flask-RESTX ofrece decoradores y campos para facilitar esto.
Uso de Modelos para la Validación
Define un modelo para especificar los formatos de entrada y salida esperados.
from flask_restx import fields
item_model = api.model('Item', {
'id': fields.Integer(readOnly=True, description='The unique identifier of an item'),
'name': fields.String(required=True, description='Item name'),
'price': fields.Float(required=True, description='Item price')
})
Al decorar tus métodos de recurso con @ns.expect(item_model)
, Flask-RESTX validará automáticamente los datos JSON entrantes con este modelo.
Serialización de Respuestas
Usa el decorador @ns.marshal_with
para formatear la salida de acuerdo con el modelo.
@ns.marshal_with(item_model)
def get(self, id):
# Retrieve and return the item
Esto asegura que los datos de respuesta se adhieran a la estructura especificada, promoviendo la consistencia en toda tu API.
8. Testing Probando APIs RESTful con Apidog
Las pruebas son una parte vital del desarrollo de APIs, asegurando que tus endpoints funcionen como se espera. Apidog es una herramienta integral que agiliza las pruebas, el diseño y la documentación de APIs.
Configuración de Apidog
Descarga e Instala: Descarga Apidog gratis y sigue las instrucciones de instalación para tu sistema operativo.
Crea un Nuevo Proyecto: Inicia Apidog y crea un nuevo proyecto para tu API.

Importación de tu Especificación de API
Si has documentado tu API usando OpenAPI/Swagger, puedes importar la especificación en Apidog:
Importar Especificación: En tu proyecto Apidog, selecciona la opción para importar una especificación de API y carga tu archivo OpenAPI.


Explorar Endpoints: Apidog analizará el archivo y mostrará tus endpoints de API, parámetros y modelos.
También puedes diseñar APIs desde cero en Apidog.
Prueba de Endpoints
Selecciona un Endpoint: Elige el endpoint que deseas probar de la lista.
Configura la Solicitud:
- Método: Asegúrate de que el método HTTP correcto (GET, POST, PUT, DELETE) esté seleccionado.
- Parámetros: Ingresa cualquier parámetro de consulta o variable de ruta requerida.
- Encabezados: Establece los encabezados necesarios, como
Content-Type: application/json
. - Cuerpo: Para las solicitudes POST y PUT, proporciona la carga útil JSON.

Envía la Solicitud: Haz clic en el botón Send
para ejecutar la solicitud.
Revisa la Respuesta:
(Consejo profesional: Apidog valida la respuesta de la API automáticamente.)
- Código de Estado: Verifica que el código de estado de la respuesta coincida con las expectativas (por ejemplo, 200 para éxito, 201 para creación).
- Cuerpo de la Respuesta: Comprueba que los datos devueltos sean correctos y estén formateados correctamente.
- Encabezados: Inspecciona los encabezados de respuesta para obtener información adicional.

9. Generación de Documentación de API con Flask-RESTX
Una documentación completa es esencial para cualquier API, facilitando la facilidad de uso e integración para los desarrolladores. Flask-RESTX proporciona soporte integrado para generar documentación de API interactiva.
Generar documentación de API completa y fácil de usar es crucial para los desarrolladores y usuarios que interactúan con tu API. Flask-RESTX simplifica este proceso generando automáticamente documentación de Swagger UI, proporcionando una interfaz interactiva para explorar y probar tus endpoints de API.
Documentación Automática de Swagger
Por defecto, Flask-RESTX genera documentación de Swagger accesible en la URL raíz de tu API. Esta característica ofrece una visión general inmediata de la estructura de tu API y los endpoints disponibles sin configuración adicional.
Personalización de la Documentación con Decoradores
Flask-RESTX proporciona varios decoradores para mejorar y personalizar la documentación de tu API:
@api.doc()
: Agrega información adicional a tus recursos o métodos. Por ejemplo, para documentar parámetros:
@api.route('/my-resource/<id>')
@api.doc(params={'id': 'An ID'})
class MyResource(Resource):
def get(self, id):
return {}
@api.response()
: Documenta las respuestas esperadas, incluyendo códigos de estado y descripciones:
@api.route('/my-resource/<id>')
class MyResource(Resource):
@api.response(403, 'Not Authorized')
def post(self, id):
api.abort(403)
@api.marshal_with()
: Especifica el modelo de salida para una respuesta, asegurando un formato de datos consistente:
@api.route('/item/<int:id>')
class ItemResource(Resource):
@api.marshal_with(item_model)
def get(self, id):
# Retrieve and return the item
@api.expect()
: Define el modelo de entrada esperado para las solicitudes, facilitando la validación y la documentación:
@api.route('/item')
class ItemResource(Resource):
@api.expect(item_model)
def post(self):
# Handle the post request
Organización con Namespaces
Los Namespaces en Flask-RESTX ayudan a agrupar recursos relacionados, mejorando la organización de tu API y su documentación.
from flask_restx import Namespace, Resource
ns = Namespace('items', description='Item operations')
@ns.route('/<int:id>')
class ItemResource(Resource):
def get(self, id):
# Retrieve and return the item
Al registrar el namespace con la API, todas las rutas y la documentación asociadas se agrupan adecuadamente:
api.add_namespace(ns)
Acceso a la Interfaz de Usuario de Swagger
Una vez que tu aplicación Flask-RESTX esté en ejecución, puedes acceder a la interfaz de usuario de Swagger generada automáticamente navegando a la URL raíz de tu API (por ejemplo, http://localhost:5000/
). Esta interfaz proporciona una exploración interactiva de tu API, mostrando los endpoints disponibles, las entradas esperadas y las posibles respuestas.
Al aprovechar estas características, te aseguras de que tu API esté bien documentada, sea fácil de usar y sea fácilmente comprensible para los desarrolladores y consumidores por igual.
10. Mejora de la Documentación de la API con Apidog
Si bien Flask-RESTX proporciona documentación básica, Apidog ofrece funciones avanzadas para la documentación de la API, incluida la personalización, la generación automatizada de código y las pruebas en tiempo real.

Utiliza el editor visual de Apidog para definir los endpoints de tu API, los parámetros de solicitud y los esquemas de respuesta. Con un solo clic, genera documentación de API completa e interactiva.

Comparte tu documentación con los miembros del equipo o socios externos, permitiéndoles probar los endpoints de la API directamente dentro de la documentación.
Al integrar Flask-RESTX con Apidog, puedes crear APIs robustas con documentación de nivel profesional, mejorando tanto la eficiencia del desarrollo como la experiencia del usuario.
Conclusión
En esta guía completa, hemos explorado el proceso de construcción de APIs RESTful utilizando Flask-RESTX, una poderosa extensión para Flask que agiliza el desarrollo de APIs. Hemos cubierto temas esenciales como la configuración de tu entorno de desarrollo, la creación y gestión de endpoints de API, la validación y serialización de datos, y la generación de documentación de API interactiva.
Además, hemos presentado Apidog, una herramienta versátil que mejora tu flujo de trabajo de desarrollo de APIs al ofrecer características como pruebas automatizadas, pruebas de rendimiento y documentación colaborativa. Al integrar Apidog en tu proceso de desarrollo, puedes asegurar que tus APIs sean robustas, eficientes y estén bien documentadas.