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

# Ruta del archivo: config.py
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 deuvicorn.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

  1. Visitarailway.app, inicia sesión con GitHub
  2. New Project → Deploy from GitHub repo → selecciona fastapi-blog
  3. Railway detecta automáticamente el Procfile
  4. Configura las variables de entorno en Variables
  5. Haz clic en Deploy

Configuración de variables de entorno

Nombre de la variableValorDescripción
SECRET_KEYCadena larga generada aleatoriamenteClave de firma JWT
DATABASE_URLInyectado por RailwayBase 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

FuncionalidadFastAPIDjangoFlask
ORMSQLAlchemyDjango ORM (integrado)Flask-SQLAlchemy
Validación de datosPydanticDjango FormsFlask-WTF
Organización de rutasAPIRouterurls.pyBlueprint
Autenticación de usuariosJWT + OAuth2Session Auth (integrado)Flask-Login(Session)
Migraciones de base de datosAlembicmakemigrations / migrateFlask-Migrate
Panel de administraciónsqladminDjango AdminFlask-Admin
Documentación de API/docs (automático)Se requiere drf-spectacularSe requiere Flasgger
ServidorUvicorn(ASGI)Gunicorn(WSGI)Gunicorn(WSGI)

Próximos pasos de aprendizaje

Tema de aprendizaje¿Para quién es adecuado?Punto de partida recomendado
SQLAlchemy asíncronoNecesitas mayor rendimiento de concurrenciaCambiar las Session síncronas a AsyncSession
FastAPI + Vue3/React con frontend y backend separadosArquitectura SPA + APIReemplaza las plantillas Jinja2 por Vue3/React, y FastAPI actúa puramente como backend de API.
WebSocketNecesitas envíos en tiempo real (chat, notificaciones)FastAPI soporta WebSocket de forma nativa: @app.websocket()
PostgreSQLBase de datos de nivel de producciónReemplaza DATABASE_URL, instala asyncpg o psycopg2
Otras extensiones