Cat

AIOgram3 17. Подготовка к разворачиванию на сервере

В этом посте мы подготовим бота к разворачиванию на сервере.

Все статьи

Icon Link

Дополнительные материалы

Icon Link

Реклама

Icon Link
Telegram-бот на AIOgram3 proDream 06 Февраль 2024 Просмотров: 1446

В одном из следующих постов в цикле "Применение 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-файла, а о том, как это будет работать на сервере, узнаете в следующих постах.

Автор

    Нет комментариев

    Реклама