Я хочу создать REST-сервис, используя FastAPI и aio-pika, работая асинхронно. Для других драйверов баз данных asyn c я мог бы создавать клиентов при запуске, когда они попадают в обработчики маршрутов. Например, для двигателя я бы объявил простой диспетчер соединений:
from motor.motor_asyncio import AsyncIOMotorClient
class Database:
client: AsyncIOMotorClient = None
db = Database()
async def connect_to_mongo():
db.client = AsyncIOMotorClient("mongo:27017")
async def close_mongo_connection():
db.client.close()
async def get_mongo_client() -> AsyncIOMotorClient:
return db.client
Затем добавьте пару обработчиков:
app.add_event_handler("startup", connect_to_mongo)
app.add_event_handler("shutdown", close_mongo_connection)
, а затем просто используйте get_mongo_client
, чтобы получить один из них в моем обработчике.
Проблема здесь в том, что aio-pika
требуется asyncio
l oop для функционирования. Вот пример из документации:
connection = await aio_pika.connect_robust(
"amqp://guest:guest@127.0.0.1/", loop=loop
)
А с FastAPI у меня нет asyncio l oop. Есть ли способ использовать его с интерфейсом, как в примере? Могу ли я просто создать новый l oop, используя asyncio.get_event_loop()
, и передать его в connect_robust
, не используя его в действительности? Как это:
connection = await aio_pika.connect_robust(
"amqp://guest:guest@127.0.0.1/", loop=asyncio.get_event_loop()
)