Передать экземпляр класса в fastapi приложение из файла запускающего сервер

Пишу своё асинхронное приложение для онлайн чата на сайте. Его суть: сообщения из чата на сайте пересылаются операторам в телеграм с помощью телеграм бота, а сообщения в телеграме от операторов пересылаются в этот чат так же с помощью телеграм бота. Протокол websocket.

Структура приложения:

main.py - стандартное fastapi приложение
bot.py - содержит класс бота и все функции, которые связаны с ботом
start.py - файл который рулит всем этим и запускает весь сервер

start.py:

# python 3.8
import asyncio
from uvicorn import Config, Server
from bot import Bot
import main


# функция запускающая бота
async def run_bot():
    token = '...'
    # вот этот экземпляр мне нужно прокинуть в main.py
    bot = Bot(token=token)
    await bot.polling()


# функция запускающая весь сервер (http server и телеграм бота)
async def run_server():
    config = Config(app='main:app', host='192.168.0.79', reload=True, loop=loop)
    server = Server(config)

    telegram_server = asyncio.create_task(run_bot())
    http_server = asyncio.create_task(server.serve())

    await asyncio.gather(telegram_server, http_server)


if __name__ == '__main__':
    loop = asyncio.new_event_loop()
    loop.run_until_complete(run_server())

Файл main.py:

# ...
""" Не имеет значения, что тут будет.
Мне нужно прокинуть в этот файл экземпляр класса Bot,
созданный в файле start.py. Как это сделать? """
print(bot)

Ответы (1 шт):

Автор решения: Serg Bocharov

Токен храните в переменных окружения (это основы безопасности) Посмотрите в сторону os.getenv()

Или хотя бы в config.py

token=your_token_here

Тогда start.py:

import config
bot = Bot(token=config.token)
# функция запускающая бота
async def run_bot(bot):
    await bot.polling()

И соответственно main.py:

from start import bot
print(bot)

Вывод:

<bot.Bot object at 0x0000028A8371D3D0>
→ Ссылка