JavaRush /Курсы /Модуль 4: FastAPI /Настройка проекта и структура приложения FastAPI

Настройка проекта и структура приложения FastAPI

Модуль 4: FastAPI
1 уровень , 3 лекция
Открыта

Представьте, что вы строите дом. Если у вас будет кривой фундамент и бардак в размещении комнат, то жить там будет некомфортно, а ремонт обойдётся в разы дороже. В программировании так же: разовая настройка проекта с чёткой структурой делает разработку проще, а масштабирование приложения — менее болезненным. Заодно коллеги скажут вам спасибо (и, возможно, поставят дополнительный "👍" в 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-проекта

  1. Группируйте маршруты по функционалу. Например, все маршруты для пользователей можно поместить в user_routes.py, а для заказа товаров — в order_routes.py.
  2. Используйте модульные тесты. Убедитесь, что каждый файл можно протестировать отдельно. Это может быть важно, когда проект вырастет.
  3. Следите за читаемостью. Если файл становится длинным, разбивайте его на несколько модулей.
  4. Пишите документацию. Особенно важно для маршрутов с нестандартным поведением.

На этом настройка и базовая структура завершены. Мы уже создали фундамент для более сложного приложения. В следующих лекциях мы изучим больше о маршрутизации, работе с запросами и данными. Готовьтесь к новым вызовам и интересным фичам FastAPI! 🚀

1
Задача
Модуль 4: FastAPI, 1 уровень, 3 лекция
Недоступна
Перенос маршрута в модуль
Перенос маршрута в модуль
Комментарии (2)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Илья Уровень 90
22 декабря 2025

Gemini с учетом Pydantic V2 пример конфига переделал под новый стандарт 

from pydantic_settings import BaseSettings  

class Settings(BaseSettings):  
    # Значения по умолчанию (будут перезаписаны, если переменные есть в .env)
    app_name: str = "My_App"  
    debug: bool = True  

    # Настройка источника данных (Pydantic V2 style)
    model_config = {
        "env_file": ".env",
        "env_file_encoding": "utf-8"
    }

# Инициализируем объект настроек (Singleton) для импорта в другие модули
settings = Settings()
Евгений Уровень 93
11 ноября 2025
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