打包上线 — 部署到 Railway
本章你将学会 FastAPI 的生产环境配置,并用 Railway 将博客部署上线。
生产环境配置管理
(venv) $ pip install pydantic-settings python-dotenv
实例
# 文件路径:config.py
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
"""应用配置(自动从 .env 文件中读取)"""
app_name: str = "RUNOOB 博客"
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 天
class Config:
env_file = ".env" # 指定环境变量文件
settings = Settings()
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
"""应用配置(自动从 .env 文件中读取)"""
app_name: str = "RUNOOB 博客"
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 天
class Config:
env_file = ".env" # 指定环境变量文件
settings = Settings()
创建 .env 文件:
SECRET_KEY=a1b2c3d4...your-real-secret-key DATABASE_URL=sqlite:///./blog.db DEBUG=False
生成依赖文件
(venv) $ pip freeze > requirements.txt
确保包含核心依赖:fastapi、uvicorn、sqlalchemy、jinja2、alembic、passlib、python-jose、python-multipart、sqladmin、pydantic-settings。
配置 Procfile 和启动命令
FastAPI 使用 ASGI 服务器,与 Flask/Django 的 WSGI 不同:
web: uvicorn main:app --host 0.0.0.0 --port $PORT
如果需要多 worker(生产环境推荐):
web: gunicorn -k uvicorn.workers.UvicornWorker -w 4 main:app
WSGI vs ASGI:Django/Flask 用 Gunicorn(WSGI 服务器),FastAPI 用 Uvicorn(ASGI 服务器)。Gunicorn 本身是 WSGI,但可以通过
uvicorn.workers.UvicornWorker跑 ASGI 应用。
推送到 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
Railway 部署
- 访问 railway.app,用 GitHub 登录
- New Project → Deploy from GitHub repo → 选择 fastapi-blog
- Railway 自动检测 Procfile
- 在 Variables 中设置环境变量
- 点击 Deploy
环境变量配置
| 变量名 | 值 | 说明 |
|---|---|---|
| SECRET_KEY | 随机生成的长字符串 | JWT 签名密钥 |
| DATABASE_URL | 由 Railway 注入 | 生产数据库 |
部署成功后获得链接,访问 /docs 能看到 Swagger 文档,访问 /admin 进入后台管理。
框架对比
| 功能 | FastAPI | Django | Flask |
|---|---|---|---|
| ORM | SQLAlchemy | Django ORM(内置) | Flask-SQLAlchemy |
| 数据验证 | Pydantic | Django Forms | Flask-WTF |
| 路由组织 | APIRouter | urls.py | Blueprint |
| 用户认证 | JWT + OAuth2 | Session Auth(内置) | Flask-Login(Session) |
| 数据库迁移 | Alembic | makemigrations / migrate | Flask-Migrate |
| 后台管理 | sqladmin | Django Admin | Flask-Admin |
| API 文档 | /docs(自动) | 需 drf-spectacular | 需 Flasgger |
| 服务器 | Uvicorn(ASGI) | Gunicorn(WSGI) | Gunicorn(WSGI) |
下一步学习方向
| 学习方向 | 适合谁 | 推荐起点 |
|---|---|---|
| 异步 SQLAlchemy | 需要更高并发性能 | 将同步 Session 切换为 AsyncSession |
| FastAPI + Vue3/React 前后端分离 | SPA + API 架构 | 将 Jinja2 模板替换为 Vue3/React,FastAPI 纯做 API 后端 |
| WebSocket | 需要实时推送(聊天、通知) | FastAPI 原生支持 WebSocket:@app.websocket() |
| PostgreSQL | 生产级数据库 | 替换 DATABASE_URL,安装 asyncpg 或 psycopg2 |
