Переменные окружения в FastAPI проекте

Настройка .env, .env_example и config.py


Зачем нужны переменные окружения

Переменные окружения (environment variables) — это способ хранения настроек приложения вне кода. Они используются для:

  • Безопасности — секреты (пароли, ключи API) не попадают в код и репозиторий
  • Гибкости — одни и те же настройки для разных сред (разработка, тестирование, продакшен)
  • Удобства — изменение настроек без перезаписи кода

В нашем проекте мы будем использовать библиотеку python-dotenv для загрузки переменных из файла .env.


Создание файлов

В корне проекта создадим три файла:

                pytexpert.ru/
                ├── .env                 # Реальный файл с секретами (НЕ пушить!)
                ├── .env_example         # Шаблон с пустыми значениями (пушить)
                └── app/
                    └── config.py        # Загрузка переменных в приложение

Создание .env_example

Файл .env_example — это шаблон, который показывает, какие переменные нужны проекту. Он пушится в репозиторий, чтобы другие разработчики знали, что нужно заполнить.

Создайте файл .env_example в корне проекта:

                # Приложение
APP_NAME=Мой сайт на FastAPI
APP_DESCRIPTION=Учебный проект
APP_VERSION=1.0.0
APP_PORT=8000
APP_HOST=127.0.0.1
APP_DEBUG=True

# Логирование
LOG_PRINT=1  # 1 - выводить логи в консоль, 0 - только в файлы

Создание .env

Теперь создайте .env — это реальный файл с вашими данными. Он создаётся на основе .env_example.

Создайте файл .env в корне проекта:

                # Приложение
APP_NAME=pytexpert.ru
APP_DESCRIPTION=Сайт про Python и программирование
APP_VERSION=1.0.0
APP_PORT=8000
APP_HOST=127.0.0.1
APP_DEBUG=True

# Логирование
LOG_PRINT=1

Обновление .gitignore

Проверьте, что файл .gitignore в корне проекта содержит следующие строки:

                # Виртуальное окружение
.venv/
venv/
env/

# Файлы с секретами
.env
.env.local

# Логи
log/
*.log

# База данных
*.db
*.sqlite

# Системные файлы
__pycache__/
*.pyc
.DS_Store
Thumbs.db

.env уже должен быть в списке. Если нет — добавьте его вручную.


Создание config.py

Теперь создадим файл app/config.py, который будет загружать переменные из .env и делать их доступными для всего приложения.

Создайте файл app/config.py:

                import os
from dotenv import load_dotenv

# Загружаем переменные из файла .env
load_dotenv()


class Settings:
    """Класс настроек приложения"""
    
    # Приложение
    APP_NAME = os.getenv("APP_NAME", "FastAPI приложение")
    APP_DESCRIPTION = os.getenv("APP_DESCRIPTION", "")
    APP_VERSION = os.getenv("APP_VERSION", "1.0.0")
    APP_PORT = int(os.getenv("APP_PORT", 8000))
    APP_HOST = os.getenv("APP_HOST", "127.0.0.1")
    APP_DEBUG = os.getenv("APP_DEBUG", "True").lower() in ("true", "1", "yes")
    
    # Логирование
    LOG_PRINT = os.getenv("LOG_PRINT", "1").lower() in ("1", "true", "yes")


settings = Settings()

Разбор кода config.py

  • load_dotenv() — загружает переменные из файла .env в окружение
  • os.getenv() — читает переменную из окружения. Если переменной нет — возвращает значение по умолчанию
  • int() — преобразует строку в число (для порта)
  • str.lower() — приводит строку к нижнему регистру для проверки булевых значений
  • settings = Settings() — создаём единственный экземпляр настроек для всего приложения

Использование в main.py

Теперь обновим app/main.py, чтобы использовать настройки из config.py:

                from fastapi import FastAPI
from .config import settings

app = FastAPI(
    title=settings.APP_NAME,
    description=settings.APP_DESCRIPTION,
    version=settings.APP_VERSION,
)

@app.get("/")
async def home():
    return {"message": f"Добро пожаловать на {settings.APP_NAME}!"}

@app.get("/about")
async def about():
    return {"message": "Это страница 'О проекте'."}

@app.get("/settings")
async def show_settings():
    """Эндпоинт для проверки настроек (только для разработки)"""
    return {
        "app_name": settings.APP_NAME,
        "app_description": settings.APP_DESCRIPTION,
        "app_version": settings.APP_VERSION,
        "app_port": settings.APP_PORT,
        "app_host": settings.APP_HOST,
        "app_debug": settings.APP_DEBUG,
    }

Проверка работы

Убедитесь, что виртуальное окружение активировано:

.venv\Scripts\activate  # Windows
source .venv/bin/activate  # Linux/Mac

Запустите сервер:

uvicorn app.main:app --reload

Откройте в браузере http://127.0.0.1:8000/settings — вы должны увидеть JSON с вашими настройками.

Теперь попробуйте изменить значения в файле .env (например, APP_NAME=Мой тестовый сайт) и перезапустите сервер. Настройки изменятся без правки кода.


Итог

Сегодня мы сделали:

  • ✅ Создали .env_example — шаблон переменных для репозитория
  • ✅ Создали .env — реальный файл с настройками (в .gitignore)
  • ✅ Создали app/config.py — загрузчик переменных окружения
  • ✅ Обновили app/main.py — используем настройки в приложении
  • ✅ Проверили работу через эндпоинт /settings

После проверки закоммитьте и запушьте изменения в GitHub:

git add .
git commit -m "Добавлены переменные окружения и config.py"
git push

Ищете хостинг для размещения вашего проекта в сети Интернет?
Посмотрите здесь →

Реклама. ООО «Бегет» ИНН 7801451618 erid: 2VtzqxQSRkE