Мои проекты

Переменные окружения без путаницы с ключами

Где хранить ключи, чем публичный ключ отличается от секретного и почему одного файла .env недостаточно.

Урок 5 / 22 · Commentail 1.3.2

YOUR_API_KEY в уроках — место для вашего значения, а не готовый ключ. Получите значение в кабинете выбранного сервиса и замените только его. Имя RESEND_API_KEY слева оставьте: по нему Python найдёт настройку.

Три разных значения

Значение Для чего нужно Можно показывать читателю?
RESEND_API_KEY Разрешает серверу отправлять письма через Resend Нет, это секрет
CAPTCHA_SITE_KEY Показывает нужный виджет CAPTCHA Да, этот ключ попадёт в HTML
CAPTCHA_SECRET_KEY Позволяет серверу проверять ответ CAPTCHA Нет, это секрет

Публичный и секретный ключ должны относиться к одной CAPTCHA нужного типа. Ключ почты нельзя использовать вместо ключа CAPTCHA.

Зададим значения в терминале

Для локального терминала macOS/Linux:

sh
export RESEND_API_KEY='YOUR_API_KEY'
export DEFAULT_FROM_EMAIL='Comments <comments@YOUR_VERIFIED_DOMAIN>'
export CAPTCHA_SITE_KEY='YOUR_SITE_KEY'
export CAPTCHA_SECRET_KEY='YOUR_SECRET_KEY'

Для PowerShell:

powershell
$env:RESEND_API_KEY = 'YOUR_API_KEY'
$env:DEFAULT_FROM_EMAIL = 'Comments <comments@YOUR_VERIFIED_DOMAIN>'
$env:CAPTCHA_SITE_KEY = 'YOUR_SITE_KEY'
$env:CAPTCHA_SECRET_KEY = 'YOUR_SECRET_KEY'

Угловые скобки в адресе сохраняются: это форма Имя <адрес>. YOUR_VERIFIED_DOMAIN замените доменом, который вы подтвердили у почтового провайдера. Пока выбираете только CAPTCHA, почтовые переменные из примера можно не задавать.

Как Django получает значения

В settings.py используем import os и os.environ["RESEND_API_KEY"]. Квадратные скобки намеренно вызывают ошибку, если обязательного значения нет. KeyError с именем переменной означает, что процесс её не получил. Не исправляйте это подстановкой рабочего ключа прямо в Python-файл.

Проверьте только наличие значения, не печатая секрет:

sh
python -c "import os; print('RESEND_API_KEY:', bool(os.environ.get('RESEND_API_KEY')))"

True означает, что строка непустая; это ещё не проверка правильности ключа. YOUR_API_KEY тоже непустая строка, поэтому тестовая отправка всё равно нужна.

Передадим значения рабочему сайту

Переменные из терминала доступны запущенным из него процессам, но не другой уже открытой вкладке, cron, контейнеру или systemd-службе. На сервере внесите их в раздел Environment/Secrets своей панели либо в защищённый файл окружения существующей службы. Затем перезапустите и сайт, и обработчик. Используйте те же базу и settings-модуль.

Django сам не читает .env. Если ваш проект уже использует загрузчик .env, следуйте его формату; иначе для первых уроков используйте команды выше. Не добавляйте второй загрузчик только ради этих примеров. Файл с секретами храните вне публичной папки и Git, с доступом только владельца/службы. При утечке отзовите ключ в кабинете и выдайте новый; удаление строки из статьи или Git не отзывает доступ.

После эксперимента удалите тестовую CAPTCHA и отзовите выделенный тестовый API-ключ. Перед удалением убедитесь, что рабочий сайт использует другой ресурс.

Другие уроки по этой задаче

Документация по теме

Была ли статья полезна?

Комментарии 0

Имя: до 40 символов.

После отправки мы пришлём письмо со ссылкой для подтверждения email.

Не более 5000 символов.

Опубликованных комментариев пока нет.