Представьте, что вы строите дом. Если у вас будет кривой фундамент и бардак в размещении комнат, то жить там будет некомфортно, а ремонт обойдётся в разы дороже. В программировании так же: разовая настройка проекта с чёткой структурой делает разработку проще, а масштабирование приложения — менее болезненным. Заодно коллеги скажут вам спасибо (и, возможно, поставят дополнительный "👍" в Slack).
FastAPI предоставляет гибкость в организации проекта, но с этой свободой приходит большая ответственность. Сегодня мы разберёмся, как организовать файлы и модули так, чтобы у вас получился чистый и понятный код.
Минимальная структура FastAPI-проекта
На данном этапе нам понадобится лишь несколько базовых элементов:
project/
└── app/
├── main.py
└── __init__.py
- main.py — это точка входа. В нём мы будем регистрировать эндпоинты и запускать наше приложение.
- __init__.py — пустой файл, который обозначает, что папка
appявляется Python-пакетом.
Давайте создадим эту структуру в нашей рабочей директории.
Начальная настройка файла main.py
main.py — это сердце нашего приложения. В нём мы создаём объект приложения FastAPI и описываем эндпоинты. Сейчас мы сделаем базовую настройку:
# app/main.py
from fastapi import FastAPI
# Создаем экземпляр приложения
app = FastAPI()
# Простое приветствие для проверки работоспособности
@app.get("/")
async def root():
return {"message": "Привет, FastAPI!"}
Сохранили файл? Отлично! Но как запустить это чудо?
Запуск приложения
Для этого нам нужен Uvicorn — сервер, который поддерживает FastAPI. В терминале выполните команду:
uvicorn app.main:app --reload
Разберём её:
app.main— это путь к вашему модулю (папкаapp, файлmain.py).app— это объект приложения, который мы создали вmain.py.--reload— активирует автоматическую перезагрузку сервера при изменении кода. Это удобно во время разработки.
Теперь перейдите в браузер и откройте http://127.0.0.1:8000. Если вы увидели сообщение {"message": "Привет, FastAPI!"}, поздравляю, вы молодец!
О, и не забудьте проверить встроенную документацию API по адресу http://127.0.0.1:8000/docs. Да-да, её FastAPI создаёт автоматически!
Развитие структуры: модули, маршруты и настройки
Конечно, в реальных приложениях проект состоит не из одного файла. Давайте добавим немного структуры и логики.
Расширяем структуру проекта
На данном этапе она будет выглядеть так:
project/
└── app/
├── main.py
├── __init__.py
├── routes/
│ ├── __init__.py
│ └── example_routes.py
└── config.py
- routes/ — сюда мы будем складывать маршруты (эндпоинты). Например, обработка запросов для пользователей, товаров и т.д.
- config.py — файл для хранения настроек, таких как параметры подключения к базе данных или конфигурация логгирования.
Перенос маршрутов в отдельный модуль
Создадим файл example_routes.py в папке routes:
# app/routes/example_routes.py
from fastapi import APIRouter
router = APIRouter()
@router.get("/greet")
async def greet_user(name: str = "Гость"):
return {"message": f"Привет, {name}!"}
Обратите внимание на объект APIRouter. Это удобный способ группировать маршруты и подключать их к основному приложению.
Теперь подключим этот роутер в main.py:
# app/main.py
from fastapi import FastAPI
from app.routes import example_routes
app = FastAPI()
# Подключаем маршруты из example_routes
app.include_router(example_routes.router)
@app.get("/")
async def root():
return {"message": "Привет, FastAPI!"}
Перезапустите сервер. Теперь, если вы перейдёте по адресу http://127.0.0.1:8000/greet?name=Питон, API радостно поприветствует вас: {"message": "Привет, Питон!"}.
Отделяем настройки в config.py
Файл config.py позволяет удобно работать с переменными окружения и настройками. Пример:
# app/config.py
from pydantic import BaseSettings
class Settings(BaseSettings):
app_name: str = "Моё FastAPI-приложение"
debug: bool = True
class Config:
env_file = ".env"
settings = Settings()
Теперь вы можете использовать этот файл в любом месте вашего приложения. Например, выведем имя приложения в main.py:
# app/main.py
from fastapi import FastAPI
from app.config import settings
from app.routes import example_routes
app = FastAPI(title=settings.app_name)
app.include_router(example_routes.router)
@app.get("/")
async def root():
return {"message": f"Добро пожаловать в {settings.app_name}!"}
Не забудьте создать файл .env на уровне проекта и поместить в него ваши переменные окружения:
APP_NAME=Моё супер-приложение
DEBUG=True
Для больших проектов pydantic и переменные окружения помогут поддерживать добавление новых настроек без изменения основного кода.
Практические советы по организации FastAPI-проекта
- Группируйте маршруты по функционалу. Например, все маршруты для пользователей можно поместить в
user_routes.py, а для заказа товаров — вorder_routes.py. - Используйте модульные тесты. Убедитесь, что каждый файл можно протестировать отдельно. Это может быть важно, когда проект вырастет.
- Следите за читаемостью. Если файл становится длинным, разбивайте его на несколько модулей.
- Пишите документацию. Особенно важно для маршрутов с нестандартным поведением.
На этом настройка и базовая структура завершены. Мы уже создали фундамент для более сложного приложения. В следующих лекциях мы изучим больше о маршрутизации, работе с запросами и данными. Готовьтесь к новым вызовам и интересным фичам FastAPI! 🚀
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
from pydantic import BaseSettingsэто вызовет ошибку pydantic.errors.PydanticImportError: `BaseSettings` has been moved to the `pydantic-settings` package. See https://docs.pydantic.dev/2.12/migration/#basesettings-has-moved-to-pydantic-settings for more details. Теперьpip install pydantic-settingsи уже затемfrom pydantic_settings import BaseSettings