Empaquetar y publicar — Implementar en Railway
En este capítulo aprenderás la configuración de producción de FastAPI y desplegarás el blog en línea con Railway.
Gestión de configuración de producción
(venv) $ pip install pydantic-settings python-dotenv
Ejemplo
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
"""Configuración de la aplicación (se lee automáticamente desde el archivo .env)"""
app_name: str = "Blog de EJEMPLO"
debug: bool = False
secret_key: str = "dev-secret-key-change-me"
database_url: str = "sqlite:///./blog.db"
access_token_expire_minutes: int = 60 * 24 * 7 # 7 días
class Config:
env_file = ".env" # Especificar el archivo de variables de entorno
settings = Settings()
Crear.envArchivo:
SECRET_KEY=a1b2c3d4...your-real-secret-key DATABASE_URL=sqlite:///./blog.db DEBUG=False
Generar archivo de dependencias
(venv) $ pip freeze > requirements.txt
Asegúrate de incluir las dependencias principales: fastapi, uvicorn, sqlalchemy, jinja2, alembic, passlib, python-jose, python-multipart, sqladmin, pydantic-settings.
Configurar Procfile y comando de inicio
FastAPI utiliza un servidor ASGI, a diferencia del WSGI de Flask/Django:
web: uvicorn main:app --host 0.0.0.0 --port $PORT
Si necesitas varios workers (recomendado en producción):
web: gunicorn -k uvicorn.workers.UvicornWorker -w 4 main:app
WSGI vs ASGI: Django/Flask usan Gunicorn (servidor WSGI), FastAPI usa Uvicorn (servidor ASGI). Gunicorn en sí es WSGI, pero puede a través de
uvicorn.workers.UvicornWorkerejecutar aplicaciones ASGI.
Subir a GitHub
$ git init $ echo "venv/" > .gitignore $ echo "__pycache__/" >> .gitignore $ echo "*.pyc" >> .gitignore $ echo ".env" >> .gitignore $ git add . $ git commit -m "初始化 FastAPI 博客项目" $ git branch -M main $ git remote add origin https://github.com/你的用户名/fastapi-blog.git $ git push -u origin main
Despliegue en Railway
- Visitarailway.app, inicia sesión con GitHub
- New Project → Deploy from GitHub repo → selecciona fastapi-blog
- Railway detecta automáticamente el Procfile
- Configura las variables de entorno en Variables
- Haz clic en Deploy
Configuración de variables de entorno
| Nombre de la variable | Valor | Descripción |
|---|---|---|
| SECRET_KEY | Cadena larga generada aleatoriamente | Clave de firma JWT |
| DATABASE_URL | Inyectado por Railway | Base de datos de producción |
Después de un despliegue exitoso, obtendrás un enlace. Accede a /docs para ver la documentación de Swagger, y a /admin para entrar a la administración.
Comparación de frameworks
| Funcionalidad | FastAPI | Django | Flask |
|---|---|---|---|
| ORM | SQLAlchemy | Django ORM (integrado) | Flask-SQLAlchemy |
| Validación de datos | Pydantic | Django Forms | Flask-WTF |
| Organización de rutas | APIRouter | urls.py | Blueprint |
| Autenticación de usuarios | JWT + OAuth2 | Session Auth (integrado) | Flask-Login(Session) |
| Migraciones de base de datos | Alembic | makemigrations / migrate | Flask-Migrate |
| Panel de administración | sqladmin | Django Admin | Flask-Admin |
| Documentación de API | /docs (automático) | Se requiere drf-spectacular | Se requiere Flasgger |
| Servidor | Uvicorn(ASGI) | Gunicorn(WSGI) | Gunicorn(WSGI) |
Próximos pasos de aprendizaje
| Tema de aprendizaje | ¿Para quién es adecuado? | Punto de partida recomendado |
|---|---|---|
| SQLAlchemy asíncrono | Necesitas mayor rendimiento de concurrencia | Cambiar las Session síncronas a AsyncSession |
| FastAPI + Vue3/React con frontend y backend separados | Arquitectura SPA + API | Reemplaza las plantillas Jinja2 por Vue3/React, y FastAPI actúa puramente como backend de API. |
| WebSocket | Necesitas envíos en tiempo real (chat, notificaciones) | FastAPI soporta WebSocket de forma nativa: @app.websocket() |
| PostgreSQL | Base de datos de nivel de producción | Reemplaza DATABASE_URL, instala asyncpg o psycopg2 |