Una implementación completa de backend FastAPI para un Servicio Simple de Redes Sociales (SNS) que permite a los usuarios crear, recuperar, actualizar y eliminar publicaciones; agregar comentarios; y dar/quitar me gusta a las publicaciones.
- Framework: FastAPI con Python 3.12+
- Base de Datos: SQLite (
sns_api.db) - Documentación de API: Swagger UI + especificación OpenAPI 3.1
- CORS: Habilitado para solicitudes de origen cruzado
- Validación de Datos: Modelos Pydantic con validación integral
python/
├── main.py # Punto de entrada de la aplicación FastAPI
├── models.py # Modelos de datos y esquemas Pydantic
├── database.py # Operaciones de base de datos SQLite
├── openapi.yaml # Especificación OpenAPI 3.0.1
├── sns_api.db # Archivo de base de datos SQLite (auto-creado)
├── README.md # Esta documentación
└── .venv/ # Entorno virtual (creado durante la configuración)
Consulta el documento README para la preparación.
Primero, establece la variable de entorno de $REPOSITORY_ROOT.
# bash/zsh
REPOSITORY_ROOT=$(git rev-parse --show-toplevel)# PowerShell
$REPOSITORY_ROOT = git rev-parse --show-toplevelLuego, navega al directorio python y crea un entorno virtual:
cd $REPOSITORY_ROOT/complete/pythonCrear entorno virtual
# Usando uv (recomendado)
uv venv .venv# Usando Python estándar (alternativo)
python -m venv .venv# En Linux/macOS
source .venv/bin/activate# En Windows Command Prompt
.venv\Scripts\activate# Usando uv (recomendado)
uv pip install fastapi uvicorn python-multipart pyyaml# Usando pip (alternativo)
pip install fastapi uvicorn python-multipart pyyamlCopia la especificación OpenAPI del directorio padre.
# En Linux/macOS
cp ../openapi.yaml .# En Windows Command Prompt
xcopy ..\openapi.yaml .Iniciar el servidor de desarrollo
uvicorn main:app --host 0.0.0.0 --port 8000 --reloadLa aplicación estará disponible en:
- URL Base de API:
http://localhost:8000/api/ - Swagger UI:
http://localhost:8000/docs - Especificación OpenAPI:
http://localhost:8000/openapi.json
La aplicación usa SQLite con las siguientes tablas:
id(TEXT, PRIMARY KEY) - UUIDusername(TEXT, NOT NULL) - Nombre de usuario del autorcontent(TEXT, NOT NULL) - Contenido de la publicacióncreated_at(TEXT, NOT NULL) - Marca de tiempo ISOupdated_at(TEXT, NOT NULL) - Marca de tiempo ISO
id(TEXT, PRIMARY KEY) - UUIDpost_id(TEXT, NOT NULL) - Clave foránea a postsusername(TEXT, NOT NULL) - Nombre de usuario del autorcontent(TEXT, NOT NULL) - Contenido del comentariocreated_at(TEXT, NOT NULL) - Marca de tiempo ISOupdated_at(TEXT, NOT NULL) - Marca de tiempo ISO
post_id(TEXT, NOT NULL) - Clave foránea a postsusername(TEXT, NOT NULL) - Usuario que dio me gustaliked_at(TEXT, NOT NULL) - Marca de tiempo ISO- Clave primaria:
(post_id, username)
GET /api/posts- Listar todas las publicacionesPOST /api/posts- Crear una nueva publicaciónGET /api/posts/{postId}- Obtener una publicación específicaPATCH /api/posts/{postId}- Actualizar una publicaciónDELETE /api/posts/{postId}- Eliminar una publicación
GET /api/posts/{postId}/comments- Listar comentarios para una publicaciónPOST /api/posts/{postId}/comments- Crear un comentarioGET /api/posts/{postId}/comments/{commentId}- Obtener un comentario específicoPATCH /api/posts/{postId}/comments/{commentId}- Actualizar un comentarioDELETE /api/posts/{postId}/comments/{commentId}- Eliminar un comentario
POST /api/posts/{postId}/likes- Dar me gusta a una publicaciónDELETE /api/posts/{postId}/likes?username={username}- Quitar me gusta a una publicación
curl -X POST "http://localhost:8000/api/posts" \
-H "Content-Type: application/json" \
-d '{"username": "john_doe", "content": "¡Hola Mundo! Esta es mi primera publicación."}'curl -X GET "http://localhost:8000/api/posts"curl -X POST "http://localhost:8000/api/posts/{POST_ID}/comments" \
-H "Content-Type: application/json" \
-d '{"username": "jane_smith", "content": "¡Excelente publicación!"}'curl -X POST "http://localhost:8000/api/posts/{POST_ID}/likes" \
-H "Content-Type: application/json" \
-d '{"username": "alice_johnson"}'- Navega a
http://localhost:8000/docs - Explora y prueba todos los endpoints de API de forma interactiva
- Ve esquemas de solicitud/respuesta y ejemplos
NewPostRequest:{username: str, content: str}UpdatePostRequest:{username: str, content: str}NewCommentRequest:{username: str, content: str}UpdateCommentRequest:{username: str, content: str}LikeRequest:{username: str}
Post: Objeto de publicación completo con metadatos y conteosComment: Objeto de comentario completo con metadatosLikeResponse: Confirmación de me gusta con marca de tiempo
La aplicación usa configuraciones por defecto pero puede ser personalizada:
- Base de Datos: Archivo SQLite
sns_api.db(auto-creado) - Host:
0.0.0.0(todas las interfaces) - Puerto:
8000 - CORS: Habilitado para todos los orígenes
Para despliegue en producción, considera:
- Base de Datos: Cambia a PostgreSQL o MySQL
- Variables de Entorno: Usa para configuración sensible
- Seguridad: Agrega autenticación y autorización
- CORS: Restringe a dominios específicos
- Logging: Implementa logging estructurado
- Monitoreo: Agrega verificaciones de salud y métricas
main.py: Configuración de aplicación FastAPI, middleware y definiciones de rutasmodels.py: Modelos Pydantic para validación y serialización de datosdatabase.py: Operaciones SQLite, gestión de conexiones y funciones CRUD
El proyecto sigue:
- Directrices de estilo Python PEP 8
- Mejores prácticas de FastAPI
- Patrones de programación funcional
- Anotaciones de tipo en todo el código
- Manejo integral de errores
- Define modelos Pydantic en
models.py - Agrega operaciones de base de datos en
database.py - Crea endpoints de API en
main.py - Actualiza la especificación OpenAPI si es necesario
- Puerto ya en uso: Cambia el puerto con
--port 8001 - Problemas de entorno virtual: Recrea con
rm -rf .venv && uv venv .venv - Base de datos bloqueada: Detén todas las instancias ejecutándose de la aplicación
- Errores de importación: Asegúrate de que el entorno virtual esté activado
Ejecuta con logging adicional:
uvicorn main:app --host 0.0.0.0 --port 8000 --reload --log-level debugDisclaimer: Este documento ha sido localizado por GitHub Copilot. Por lo tanto, puede contener errores. Si encuentras alguna traducción que sea inapropiada o errónea, por favor crea un issue.