Skip to content

pip3-00/POLI-API-BACKEND

Repository files navigation

πŸ›οΈ POLI-PI Backend

πŸ“‹ DescripciΓ³n del Proyecto

Este es el backend del proyecto POLI-PI, una API REST construida con FastAPI que proporciona servicios para la gestiΓ³n de noticias y autenticaciΓ³n de usuarios. El sistema permite a los administradores crear y gestionar noticias mientras que los usuarios pueden acceder a ellas de forma pΓΊblica.


πŸ› οΈ TecnologΓ­as Utilizadas

TecnologΓ­a VersiΓ³n PropΓ³sito
FastAPI 0.104.1 Framework web de alto rendimiento
Uvicorn 0.24.0 Servidor ASGI
SQLAlchemy 2.0.23 ORM para gestiΓ³n de base de datos
SQLite - Base de datos ligera
Passlib 1.7.4 Hashing de contraseΓ±as con bcrypt
Python-JOSE 3.3.3 Manejo de tokens JWT
Python-Multipart 0.0.6 Procesamiento de formularios

πŸ“ Estructura del Proyecto

poli-PI/
β”œβ”€β”€ backend/
β”‚   β”œβ”€β”€ __pycache__/
β”‚   β”œβ”€β”€ models/
β”‚   β”‚   β”œβ”€β”€ __init__.py
β”‚   β”‚   β”œβ”€β”€ user.py          # Modelo de usuario
β”‚   β”‚   └── noticia.py       # Modelo de noticia
β”‚   β”œβ”€β”€ database.py          # ConfiguraciΓ³n de base de datos
β”‚   β”œβ”€β”€ main.py              # AplicaciΓ³n principal y rutas
β”‚   └── requirements.txt     # Dependencias del proyecto
β”œβ”€β”€ assets/
β”‚   └── images/              # ImΓ‘genes del proyecto
β”œβ”€β”€ docs/                    # DocumentaciΓ³n adicional
β”œβ”€β”€ README.md
└── requirements.txt

πŸ—ƒοΈ Modelos de Datos

πŸ‘€ Usuario (User)

Campo Tipo Restricciones DescripciΓ³n
id Integer Primary Key, Index Identificador ΓΊnico
username String(50) Unique, Index, Not Null Nombre de usuario
password String(255) Not Null ContraseΓ±a hasheada

πŸ“° Noticia (Noticia)

Campo Tipo Restricciones DescripciΓ³n
id Integer Primary Key, Index Identificador ΓΊnico
titulo String(255) Not Null TΓ­tulo de la noticia
contenido Text Not Null Contenido completo de la noticia
imagen String(255) Nullable URL o ruta de la imagen

πŸ” AutenticaciΓ³n y Seguridad

Sistema de AutenticaciΓ³n

  • Protocolo: JWT (JSON Web Tokens)
  • Algoritmo: HS256
  • ** expiration_token**: 60 minutos
  • Hashing de contraseΓ±as: Bcrypt

Flujo de AutenticaciΓ³n

Usuario β†’ POST /login β†’ Credenciales vΓ‘lidas β†’ JWT Token
                                               ↓
                                    Headers: Authorization: Bearer <token>
                                               ↓
                                    Accede a rutas protegidas

πŸ“‘ Endpoints de la API

πŸ”“ Rutas PΓΊblicas

1. Inicio de SesiΓ³n

POST /login
Content-Type: application/x-www-form-urlencoded

username=admin&password=admin123

Response (200 OK):

{
  "access_token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
  "token_type": "bearer"
}

Response (401 Unauthorized):

{
  "detail": "Credenciales incorrectas"
}

2. Obtener Noticias

GET /noticias/

Response (200 OK):

[
  {
    "id": 1,
    "titulo": "TΓ­tulo de la noticia",
    "contenido": "Contenido completo de la noticia...",
    "imagen": "/images/imagen.jpg"
  }
]

πŸ”’ Rutas Protegidas (Requieren AutenticaciΓ³n)

3. Crear Noticia

POST /noticias/
Authorization: Bearer <token>
Content-Type: application/json

{
  "titulo": "Nueva Noticia",
  "contenido": "Contenido de la noticia...",
  "imagen": "/images/imagen.jpg"
}

Response (200 OK):

{
  "id": 2,
  "titulo": "Nueva Noticia",
  "contenido": "Contenido de la noticia...",
  "imagen": "/images/imagen.jpg"
}

βš™οΈ Rutas de AdministraciΓ³n

4. Crear Usuario Admin

POST /create_admin/

Response (200 OK):

{
  "message": "Admin user created",
  "username": "admin",
  "password": "admin123"
}

Response (200 OK) - Si ya existe:

{
  "message": "Admin user already exists"
}

πŸ–ΌοΈ Archivos EstΓ‘ticos

El backend sirve archivos estΓ‘ticos desde la carpeta /assets/images/:

GET /images/{nombre_archivo}

Ejemplo:

GET /images/poli-img-1.png

πŸš€ InstalaciΓ³n y ConfiguraciΓ³n

Prerrequisitos

  • Python 3.8+
  • pip

1. Clonar el Repositorio

git clone <repositorio-url>
cd poli-PI

2. Crear Entorno Virtual (Opcional pero Recomendado)

python -m venv venv
source venv/bin/activate  # En Linux/Mac
# o
venv\Scripts\activate     # En Windows

3. Instalar Dependencias

cd backend
pip install -r requirements.txt

4. Iniciar el Servidor

uvicorn main:app --reload

El servidor estarΓ‘ disponible en: http://localhost:8000

5. DocumentaciΓ³n AutomΓ‘tica


βš™οΈ ConfiguraciΓ³n

Variables de Entorno

Variable Valor Actual DescripciΓ³n
SECRET_KEY "Tlou2301" Clave secreta para JWT
ALGORITHM "HS256" Algoritmo de encriptaciΓ³n
ACCESS_TOKEN_EXPIRE_MINUTES 60 Tiempo de expiraciΓ³n del token
DATABASE_URL "sqlite:///./database.db" URL de la base de datos

⚠️ Nota: En producción, mover estas variables a un archivo .env y usar valores seguros.


πŸ—„οΈ Base de Datos

Archivo

  • UbicaciΓ³n: backend/database.db
  • Tipo: SQLite (ligera, sin configuraciΓ³n adicional)

Tablas Creadas AutomΓ‘ticamente

  1. users - Almacena usuarios del sistema
  2. noticias - Almacena las noticias

Las tablas se crean automΓ‘ticamente al iniciar la aplicaciΓ³n gracias a:

Base.metadata.create_all(bind=engine)

πŸ”§ Middleware Configurado

CORS (Cross-Origin Resource Sharing)

app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],              # Permite todos los orΓ­genes
    allow_credentials=True,           # Permite credenciales
    allow_methods=["*"],              # Permite todos los mΓ©todos
    allow_headers=["*"],              # Permite todos los headers
)

⚠️ Seguridad: En producción, reemplazar allow_origins=["*"] con los dominios específicos.


πŸ§ͺ Credenciales de Prueba

Campo Valor
Username admin
Password admin123

πŸ“¦ Dependencias Detalladas

fastapi==0.104.1
uvicorn[standard]==0.24.0
python-multipart==0.0.6
sqlalchemy==2.0.23
passlib[bcrypt]==1.7.4
python-jose[cryptography]==3.3.3
python-multipart==0.0.6

πŸ—οΈ Arquitectura

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                   CLIENTE                        β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                      β”‚ HTTP Requests
                      β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚              FASTAPI (main.py)                   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚              ENDPOINTS                     β”‚   β”‚
β”‚  β”‚  β€’ POST /login                             β”‚   β”‚
β”‚  β”‚  β€’ GET /noticias/                          β”‚   β”‚
β”‚  β”‚  β€’ POST /noticias/ (protegido)             β”‚   β”‚
β”‚  β”‚  β€’ POST /create_admin/                     β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”   β”‚
β”‚  β”‚           AUTENTICACIΓ“N JWT                β”‚   β”‚
β”‚  β”‚  β€’ verify_password()                       β”‚   β”‚
β”‚  β”‚  β€’ create_token()                          β”‚   β”‚
β”‚  β”‚  β€’ get_current_user()                      β”‚   β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜   β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                      β”‚
                      β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚               SQLALCHEMY ORM                     β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”          β”‚
β”‚  β”‚    User     β”‚      β”‚   Noticia    β”‚          β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜          β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                      β”‚
                      β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                  SQLite DB                       β”‚
β”‚           backend/database.db                    β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ“ˆ Mejoras Futuras Sugeridas

  1. AutenticaciΓ³n con OAuth2 - Integrar Google, Facebook, etc.
  2. Base de datos robusta - Migrar a PostgreSQL o MySQL
  3. Rate Limiting - Limitar solicitudes por IP
  4. Logging - Sistema de registro de eventos
  5. Unit Tests - Pruebas unitarias y de integraciΓ³n
  6. ValidaciΓ³n de datos - Uso de Pydantic models mΓ‘s robustos
  7. PaginaciΓ³n - Para endpoints con muchos resultados
  8. Upload de imΓ‘genes - Endpoint para subir imΓ‘genes

πŸ“„ Licencia

Este proyecto estΓ‘ bajo la Licencia MIT. Consulta el archivo docs/LICENSE para mΓ‘s detalles.


πŸ‘€ Autor

Desarrollado como parte del proyecto POLI-PI.


πŸ“ž Soporte

Para soporte, consulta la documentaciΓ³n en docs/deployment.md o crea un issue en el repositorio.


⌨️ Construido con ❀️ usando FastAPI y Python

Β© 2025 Todos los derechos reservados.

About

Entorno api-poli backend del proyecto.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors