Упаковка и запуск в продакшн — развёртывание на Railway
В этой главе вы узнаете о настройке производственной среды FastAPI и развернёте блог в продакшене с помощью Railway.
Управление конфигурацией производственной среды
(venv) $ pip install pydantic-settings python-dotenv
Пример
from pydantic_settings import BaseSettings
class Settings(BaseSettings):
"""Конфигурация приложения (автоматически читается из файла .env)"""
app_name: str = "EXAMPLE blog"
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 = Настройки()
Создайте.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-сервер, в отличие от WSGI во Flask/Django:
web: uvicorn main:app --host 0.0.0.0 --port $PORT
Если требуется несколько воркеров (рекомендуется для продакшена):
web: gunicorn -k uvicorn.workers.UvicornWorker -w 4 main:app
WSGI против 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
- Новый проект → Развернуть из репозитория GitHub → Выберите 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 | Flask-WTF |
| Организация маршрутов | APIRouter | urls.py | Blueprint |
| Аутентификация пользователей | JWT + OAuth2 | Аутентификация на основе сессий (встроенная) | Flask-Login(Сессия) |
| Миграции базы данных | Alembic | makemigrations / migrate | Flask-Migrate |
| Панель администратора | sqladmin | Django Admin | Flask-Admin |
| Документация API | /docs (авто) | Требуется drf-spectacular | Требуется Flasgger |
| Server | Uvicorn(ASGI) | Gunicorn(WSGI) | Gunicorn(WSGI) |
Следующие направления обучения
| Направление обучения | Кому это подходит | Рекомендуемая отправная точка |
|---|---|---|
| Асинхронный SQLAlchemy | Требуется более высокая производительность при конкурентной нагрузке | Переключите синхронный Session на AsyncSession |
| Разделение фронтенда и бэкенда: FastAPI + Vue3/React | Архитектура SPA + API | Замените шаблоны Jinja2 на Vue3/React, а FastAPI будет выступать исключительно в роли API-бэкенда. |
| WebSocket | Нужна push-доставка в реальном времени (чат, уведомления) | FastAPI нативно поддерживает WebSocket: @app.websocket() |
| PostgreSQL | База данных промышленного уровня | Замените DATABASE_URL, установите asyncpg или psycopg2 |