Переменные окружения в FastAPI проекте
Настройка .env, .env_example и config.py
- Как безопасно хранить секретные данные через переменные окружения
- Как создать и настроить файлы .env и .env_example
- Как загружать переменные окружения через config.py
- Почему .env нельзя пушить в Git
Зачем нужны переменные окружения
Переменные окружения (environment variables) — это способ хранения настроек приложения вне кода. Они используются для:
- Безопасности — секреты (пароли, ключи API) не попадают в код и репозиторий
- Гибкости — одни и те же настройки для разных сред (разработка, тестирование, продакшен)
- Удобства — изменение настроек без перезаписи кода
В нашем проекте мы будем использовать библиотеку python-dotenv для загрузки переменных из файла .env.
.env содержит чувствительные данные. Он никогда не должен попадать в репозиторий GitHub. Для этого мы создадим .gitignore и файл-пример .env_example.
Создание файлов
В корне проекта создадим три файла:
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 содержит реальные секреты. Его нужно добавить в .gitignore, чтобы случайно не залить в репозиторий.
Создайте файл .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,
}
/settings — только для разработки. В продакшене его нужно убрать или защитить.
Проверка работы
Убедитесь, что виртуальное окружение активировано:
.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
- Запустите сервер:
uvicorn app.main:app --reload - Перейдите по адресу
/settings— должны отобразиться настройки - Измените
APP_NAMEв.env, перезапустите сервер — название изменится
После проверки закоммитьте и запушьте изменения в GitHub:
git add .
git commit -m "Добавлены переменные окружения и config.py"
git push
Следующая статья: CORS — настройка кросс-доменных запросов