diff --git a/README.md b/README.md index a07aa15..5a20431 100644 --- a/README.md +++ b/README.md @@ -84,4 +84,43 @@ async def main(): if __name__ == "__main__": asyncio.run(main()) -``` \ No newline at end of file +``` +### Создадим файл конфигурации и переопределим файл секретов в него + +Итак, создадим рядом с **bot.py** отдельный файл **config_reader.py** о следующим содержимым + +config_reader.py +```py +from pydantic_settings import BaseSettings, SettingsConfigDict +from pydantic import SecretStr + + +class Settings(BaseSettings): + # Желательно вместо str использовать SecretStr + # для конфиденциальных данных, например, токена бота + bot_token: SecretStr + + # Начиная со второй версии pydantic, настройки класса настроек задаются + # через model_config + # В данном случае будет использоваться файла .env, который будет прочитан + # с кодировкой UTF-8 + model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8') + + +# При импорте файла сразу создастся +# и провалидируется объект конфига, +# который можно далее импортировать из разных мест +config = Settings() +``` +Теперь немного отредактируем наш bot.py: + + +```py bot.py +# импорты +from config_reader import config + +# Для записей с типом Secret* необходимо +# вызывать метод get_secret_value(), +# чтобы получить настоящее содержимое вместо '*******' +bot = Bot(token=config.bot_token.get_secret_value()) +``` diff --git a/bot.py b/bot.py index f65e424..bb5af1e 100644 --- a/bot.py +++ b/bot.py @@ -7,16 +7,22 @@ from datetime import datetime from aiogram import Bot, Dispatcher, types from aiogram.enums.dice_emoji import DiceEmoji from aiogram.filters.command import Command -from dotenv import load_dotenv - -load_dotenv() +from config_reader import config # Включаем логирование, чтобы не пропустить важные сообщения logging.basicConfig(level=logging.INFO) -# Объект бота -bot = Bot(token=os.getenv("BOT_TOKEN")) + +# Для записей с типом Secret* необходимо +# вызывать метод get_secret_value(), +# чтобы получить настоящее содержимое вместо '*******' +bot = Bot(token=config.bot_token.get_secret_value()) + +# Объект бота напрямую из .env +# bot = Bot(token=os.getenv("BOT_TOKEN")) + # Диспетчер dp = Dispatcher() +dp["started_at"] = datetime.now().strftime("%Y-%m-%d %H:%M") # Хэндлер на команду /start @dp.message(Command("start")) @@ -53,6 +59,11 @@ async def cmd_dice(message: types.Message): async def cmd_dice2(message: types.Message, bot: Bot): await bot.send_dice(-1001826767638, emoji=DiceEmoji.DICE) +# запрос даты запуска бота +@dp.message(Command("info")) +async def cmd_info(message: types.Message, started_at: str): + await message.answer(f"Бот запущен {started_at}") + # Запуск процесса поллинга новых апдейтов async def main(): # Регистрируем хэндлер cmd_test2 по команде /start diff --git a/config_reader.py b/config_reader.py new file mode 100644 index 0000000..c3b959e --- /dev/null +++ b/config_reader.py @@ -0,0 +1,20 @@ +from pydantic_settings import BaseSettings, SettingsConfigDict +from pydantic import SecretStr + + +class Settings(BaseSettings): + # Желательно вместо str использовать SecretStr + # для конфиденциальных данных, например, токена бота + bot_token: SecretStr + + # Начиная со второй версии pydantic, настройки класса настроек задаются + # через model_config + # В данном случае будет использоваться файла .env, который будет прочитан + # с кодировкой UTF-8 + model_config = SettingsConfigDict(env_file='.env', env_file_encoding='utf-8') + + +# При импорте файла сразу создастся +# и провалидируется объект конфига, +# который можно далее импортировать из разных мест +config = Settings() \ No newline at end of file