Как использовать aio-pika с FastAPI? - PullRequest
0 голосов
/ 27 апреля 2020

Я хочу создать 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()
        )

1 Ответ

0 голосов
/ 27 апреля 2020

Хорошо, поэтому, согласно документам , я могу просто использовать connect вместо connect_robust:

connection = await aio_pika.connect(
        "amqp://guest:guest@127.0.0.1/"
    )
...