Вярвам, че вече сте получили отговорите си във форумите за проблеми на проекта Fastapi на Github:Проблем 452 (затворен). Но тук ще обобщя решенията за бъдещи справки:
Накратко, можете да използвате двигател или mongoengine, Fastapi поддържа и двете и можете да използвате повторно глобален клиентски обект, който е започнал и приключил с процеса на приложението ви.
Някои подробности за контекста, които (надявам се) да изяснят тези технологии и техните взаимоотношения:
Официалният драйвер на MongoDB за Python е pymongo. Под капаците и MongoEngine, и Motor използват Pymongo. Pymongo внедрява директен клиент за MongoDB (демони) и предлага API на Python за отправяне на заявки.
Ако желаете, можете да използвате pymongo директно с Fastapi. (От тази SQL страна на нещата това би било еквивалентно на използване на psycopg2 в Flask директно, без да преминавате през нещо като SQLAlchemy.)
MongoEngine е ODM (обектно-документно картографиране). Той предлага обектно-ориентиран API на Python, който можете да използвате в приложението си, за да работите по-удобно и когато става въпрос за действителните DB заявки, MongoEngine ще използва pymongo.
Motor е обвивка за pymongo, която го прави неблокиращ (позволяващ async/await). Той използва цикъл на събития, или чрез Tornado, или чрез asyncio. Ако използвате Fastapi с uvicorn, uvicorn ще приложи асинхронна функционалност с uvloop. Накратко, използвайки Motor с FastAPI, асинхронът трябва да "просто работи". За съжаление, Motor не прилага ODM. В този смисъл е по-подобен на пимонго.
Fastapi обработва заявките от клиенти (използвайки Starlette), но ще ви позволи да реализирате собствена връзка с MongoDB. Така че не сте ограничени до някакъв конкретен избор, но сте предимно сами (а ла Flask).
Можете да използвате куките за стартиране/изключване на вашето приложение FastAPI, за да стартирате/спирате вашия клиент Motor/MongoEngine. Не е нужно да се притеснявате, че вашият клиентски обект няма да продължи поради проблеми с много процеси, тъй като Fastapi е еднонишков.
@app.on_event("startup")
async def create_db_client():
# start client here and reuse in future requests
@app.on_event("shutdown")
async def shutdown_db_client():
# stop your client here
Примерна реализация на мотор с Fastapi може да се намери тук.