📝 Python

.env файлы и переменные окружения: секреты вне кода

0
Author
04e5cc8b-58ac-4bdc-bdee-661bbb
📅
Published
08.05.2026
⏱️
Reading time
2 min
👁️
Views
35
🌱
Level
Beginner

Представь что ты написал программу с API-ключом прямо в коде и залил её на GitHub. Через час тебе приходит уведомление — боты уже нашли ключ и сделали 10 000 запросов от твоего имени. Твой аккаунт заблокирован.

Это реальная история. Происходит регулярно.

Правило: секреты не живут в коде

Никогда не храни в коде:
- API-ключи
- Пароли к базам данных
- Токены авторизации
- Секретные ключи приложения

Почему это критично:
- Git хранит всю историю — даже если удалишь ключ из последнего коммита, он останется в истории
- Публичный репозиторий = доступ всему миру
- Боты сканируют GitHub 24/7 в поисках ключей

Решение: файл .env

.env — текстовый файл с переменными окружения. Он хранится только локально и никогда не попадает в git.

# .env
DATABASE_URL=postgresql://user:password@localhost/mydb
API_KEY=abc123def456ghi789
SECRET_KEY=very-secret-key
DEBUG=True

Формат: ИМЯ=значение, без пробелов вокруг =.

python-dotenv: загружаем .env в Python

pip install python-dotenv
from dotenv import load_dotenv
import os

load_dotenv()  # загружает переменные из .env в os.environ

api_key = os.getenv("API_KEY")         # "abc123def456ghi789"
debug = os.getenv("DEBUG", "False")    # второй аргумент — значение по умолчанию

load_dotenv() должен вызываться до первого os.getenv().

.gitignore: защищаем .env

Добавь .env в .gitignore — тогда git вообще не будет его видеть:

# .gitignore
.env
.env.local
.env.production
.venv/
__pycache__/

Проверить что файл игнорируется:

git status  # .env не должен появляться в списке

Несколько окружений

Часто нужны разные настройки для разработки и продакшена:

.env              # локальная разработка (в gitignore)
.env.example      # шаблон без значений (коммитится в git!)
.env.production   # продакшен (на сервере, не в git)

Файл .env.example показывает какие переменные нужны, но без реальных значений:

# .env.example
API_KEY=
DATABASE_URL=
SECRET_KEY=

Новый разработчик клонирует репозиторий, копирует .env.example в .env и заполняет своими значениями.

Передача секретов на сервер

На продакшен-сервере .env файл не нужен — там переменные задаются иначе:

# Heroku:
heroku config:set API_KEY=abc123

# Railway / Render / другие хостинги:
# Через веб-интерфейс в разделе Environment Variables

# Kubernetes:
kubectl create secret generic my-secret --from-literal=API_KEY=abc123

Код остаётся одинаковым — os.getenv("API_KEY") работает везде.

Типичные ошибки

os.getenv возвращает None

# Неправильно — load_dotenv после os.getenv:
api_key = os.getenv("API_KEY")  # None
load_dotenv()

# Правильно:
load_dotenv()
api_key = os.getenv("API_KEY")  # значение из .env

В .env есть пробелы вокруг =

API_KEY = abc123   # ← неправильно, python-dotenv не разбирает
API_KEY=abc123     # ← правильно

Файл называется env вместо .env

Обязательна точка в начале: .env — это скрытый файл на Unix-системах.

Итог

Паттерн прост: все секреты в .env, .env в .gitignore, в код только os.getenv(). Этого правила достаточно чтобы никогда не утечь ключи через git.

Your reaction to the article

💬 Comments (0)

🔐 Sign in to leave a comment
🚪 Login
💭

No comments yet

Be the first to share your opinion about this article!

🔗 Similar

Similar articles

Continue learning with these materials

📝

Модуль datetime: работа с датами и временем

datetime — стандартный модуль Python для работы с датами и временем. Входит в стандартную библиотеку,...

📅 08.05.2026 👁️ 30
📝

Виртуальные окружения в Python: зачем и как

Когда начинаешь второй Python-проект и ставишь pip install requests — эта библиотека устанавливается глобально, для...

📅 08.05.2026 👁️ 31
📝

argparse: аргументы командной строки в Python

Когда скрипт вырастает из игрушки в инструмент, input() становится неудобным. Профессиональные CLI-программы принимают аргументы при...

📅 08.05.2026 👁️ 30

Did you like the article?

Subscribe to our updates and receive new articles first. Grow with PyLand!