Base modular en Flask 🐍
Una base mínima y robusta para construir una API RESTful con Flask. Incluye:
- Estructura modular
- Seguridad JWT
- Gestión de bases de datos con migraciones
- Soporte completo para Docker
Ideal para proyectos educativos, prototipos rápidos y empezar con las mejores prácticas de Flask.
-
Estructura Modular:
Flask organizado por blueprints y módulos (models/,resources/, etc.). -
Base de Datos:
SQLAlchemy + Flask-Migrate para esquema versionado y fácil de actualizar. -
Autenticación Segura:
JWT con Blocklist para invalidar tokens (logout/rotación). -
Validación de Datos:
Marshmallow (o esquemas enschema.py) para serialización/validación limpia. -
Despliegue Simple:
Incluye Dockerfile para empaquetado y despliegue reproducible. -
Configuración:
Soporte para.flaskenv(desarrollo) y variables estándar (producción).
Simple_API/
├─ app.py
├─ db.py
├─ blocklist.py
├─ schema.py
├─ requirements.txt
├─ dockerfile
├─ .flaskenv # 🔒 Variables locales (no subir secretos)
├─ models/ # Modelos SQLAlchemy
├─ resources/ # Blueprints/Endpoints de la API
├─ migrations/ # Historial de Alembic/Migrate
└─ docker/ # Assets de despliegue (si aplica)
- Python 3.10+
- pip y venv (opcional)
- Docker 24+ / Docker Desktop (opcional)
Motor de BD:
- Desarrollo: SQLite (
sqlite:///data.db) - Producción: Recomendado PostgreSQL o MySQL
git clone https://github.com/Socrates-Programmer/Simple_API.git
cd Simple_APICrear y activar entorno virtual:
python -m venv .venv- Windows (CMD/PowerShell):
.venv\Scripts\activate - Linux/Mac:
source .venv/bin/activate
Instalar dependencias:
pip install -r requirements.txtCrea un archivo .flaskenv en la raíz (solo para desarrollo local):
FLASK_APP=app.py
FLASK_ENV=development
FLASK_RUN_HOST=0.0.0.0
FLASK_RUN_PORT=5000
# Seguridad: ¡Cambia este valor!
JWT_SECRET_KEY=cambia-esto-por-un-secreto-seguro
# Base de datos
# Desarrollo (SQLite)
DATABASE_URL=sqlite:///data.db
# Producción (Postgres, ejemplo)
# DATABASE_URL=postgresql+psycopg2://user:pass@host:5432/dbname
Aplica el esquema inicial a tu base de datos:
flask db upgradeflask runAPI corriendo en:
http://localhost:5000
Construye la imagen y ejecuta el contenedor, usando las variables de entorno desde .flaskenv:
docker build -t simple-api .
docker run --name simple-api \
--env-file .flaskenv \
-p 5000:5000 simple-api(Opcional) Si agregas docker-compose.yml:
docker compose up --build| Endpoint | Descripción |
|---|---|
| POST /auth/login | Recibe credenciales y emite un access_token. |
| DELETE /auth/logout | Invalida el token activo agregándolo a blocklist. |
⚠️ Práctica de Seguridad:
En producción, la variableJWT_SECRET_KEYdebe gestionarse con un Secret Manager y no estar en archivos como.flaskenvni en el repositorio.
🔐 Autenticación y Usuarios
| Método | Endpoint | Descripción | Seguridad |
|---|---|---|---|
| POST | /register |
Registro de nuevo usuario | Pública |
| POST | /login |
Inicia sesión y devuelve access & refresh token | Pública |
| POST | /refresh |
Renueva el access token usando refresh token | JWT Refresh |
| POST | /logout |
Cierra sesión (token se agrega a blocklist) | JWT |
| GET | /user/<int:user_id> |
Obtiene un usuario por ID | Pública |
| DELETE | /user/<int:user_id> |
Elimina un usuario por ID | Pública |
📦 Items
| Método | Endpoint | Descripción | Seguridad |
|---|---|---|---|
| GET | /item |
Lista todos los items | JWT |
| POST | /item |
Crea un nuevo item | JWT (Fresh) |
| GET | /item/<int:item_id> |
Obtiene un item por ID | JWT |
| PUT | /item/<int:item_id> |
Actualiza o crea un item (upsert) | Pública |
| DELETE | /item/<int:item_id> |
Elimina un item | JWT |
🏬 Stores
| Método | Endpoint | Descripción | Seguridad |
|---|---|---|---|
| GET | /store |
Lista todas las tiendas | Pública |
| POST | /store |
Crea una nueva tienda | Pública |
| GET | /store/<int:store_id> |
Obtiene una tienda por ID | Pública |
| DELETE | /store/<int:store_id> |
Elimina una tienda | Pública |
🏷️ Tags
| Método | Endpoint | Descripción | Seguridad |
|---|---|---|---|
| GET | /store/<int:store_id>/tag |
Lista los tags de una tienda | Pública |
| POST | /store/<int:store_id>/tag |
Crea un tag en una tienda | Pública |
| GET | /tag/<int:tag_id> |
Obtiene un tag por ID | Pública |
| DELETE | /tag/<int:tag_id> |
Elimina un tag si no está asociado a items | Pública |
| POST | /item/<int:item_id>/tag/<int:tag_id> |
Asocia un tag a un item | Pública |
| DELETE | /item/<int:item_id>/tag/<int:tag_id> |
Quita un tag de un item | Pública |
| Comando | Descripción |
|---|---|
| flask db init | Inicializa el repo de migraciones (solo 1 vez) |
| flask db migrate -m "mensaje" | Crea nuevo archivo de migración |
| flask db upgrade | Aplica todas las migraciones pendientes |
| flask db downgrade | Deshace la última migración aplicada |
🛡️ Seguridad
Autenticación basada en JWT
Soporte para Access Token y Refresh Token
Logout implementado mediante BLOCKLIST
¿Dudas o propuestas de mejora?
Por favor, abre un Issue en GitHub.
Email: marcosavila3005@gmail.com