Передать экземпляр класса в 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>