AIOgram3 17. Подготовка к разворачиванию на сервере
В этом посте мы подготовим бота к разворачиванию на сервере.
Дополнительные материалы
Для скачивания материалов необходимо войти или зарегистрироваться
Файлы также можно получить в Telegram-боте по коду: 735906
Реклама
В одном из следующих постов в цикле "Применение Docker" мы с вами будем разворачивать бота на сервере, но перед этим необходимо кое-что подготовить.
Когда мы прописывали токен бота в посте "AIOgram3 3. Основная функция", я упомянул, что хранение в коде секретных данных небезопасно. В данном посте мы исправим это, и я покажу, как правильно передавать секреты в бота.
Переменные окружения.
Переменные окружения (environment variables) – это механизм хранения данных, который позволяет хранить конфигурационные параметры вне кода. Они обычно используются для хранения секретной информации, такой, как ключи API, пароли и токены, а также для хранения прочих параметров (пути к файлам, настройки приложения и т.п.).
Для хранения переменных окружения с их значениями мы будем использовать специальный, "скрытый" .env
файл. Название файла именно так и пишется <точка>env
, без каких либо расширений. Самый известный пример подобных "скрытых" файлов, это .gitignore
.
Обратите внимание. В системе может быть выключено отображение скрытых файлов.
Для получения данных из переменных окружения в коде будем использовать модуль environ
из встроенной в Python библиотеки os
.
Файл .env.
В корневой директории проекта, там, где файл main.py
, создадим .env
-файл и откроем его.
Откройте рядом файл settings.py
и найдите класс Secrets
.
Если вы повторяли все посты, то у вас должно быть шесть полей в этом классе: token
, admin_id
, group_id
, weather_key
, audio_key_id
, audio_key_secret
.
Создадим в .env
-файле такие же строки, но в верхнем регистре, т.к. переменные окружения принято прописывать заглавными буквами. После каждой переменной ставим равно =
и копируем значение из класса Secrets
. Без кавычек.
Должно получиться вот так:
TOKEN=ваш_токен
ADMIN_ID=id_администратора
GROUP_ID=id_группы
WEATHER_KEY=токен_погоды
AUDIO_KEY_ID=id_распознавания_голоса
AUDIO_KEY_SECRET=токен_распознавания_голоса
Если вы используете git, то обязательно внесите .env-файл в .gitignore!
Получение данных из окружения и .env-файла.
Когда мы будем разворачивать бота на сервере, все данные из .env
-файла будут переданы внутрь контейнера, а самого его там не будет в целях безопасности. Однако, для работы с .env
-файлом на локальной машине, необходимо его прочесть и получить из него данные.
Это можно сделать вручную, открыв файл и записав значения в словарь, но мне этот подход не нравится. К тому же всё написано до нас. Для чтения локального файла будем использовать библиотеку dotenv
.
Для установки библиотеки необходимо выполнить команду:
pip install python-dotenv
После этого добавляем её в файл requirements.txt
. Он нам понадобится во время разворачивания проекта на сервере.
python-dotenv1.0.1
Вернёмся к файлу settings.py
.
В самом начале файла, сразу после импортов, вызываем функцию load_dotenv()
для чтения .env
-файла.
from dotenv import load_dotenv
load_dotenv()
Переходим к классу Secrets
.
В нём нам необходимо заменить все значения полей на os.environ.get("")
, где в кавычках указывается переменная окружения.
Обратите внимание! Если тип поля, например, int, то и значение полученное из переменной окружения нужно приводить к этому типу.
Получается так:
@dataclass
class Secrets:
token: str = os.environ.get("TOKEN")
admin_id: int = int(os.environ.get("ADMIN_ID"))
group_id: int = int(os.environ.get("GROUP_ID"))
weather_key: str = os.environ.get("WEATHER_KEY")
audio_key_id: str = os.environ.get("AUDIO_KEY_ID")
audio_key_secret: str = os.environ.get("AUDIO_KEY_SECRET")
Завершение.
На этом подготовка закончена. Теперь на локальной машине секретные данные будут браться из .env
-файла, а о том, как это будет работать на сервере, узнаете в следующих постах.
Все статьи