Jeg tror, du allerede har fået dine svar i emneforaene for Fastapi-projektet på Github:Issue 452 (lukket). Men jeg vil opsummere løsningerne her til fremtidig reference:
Kort sagt, du kan bruge enten motor eller mongomotor, Fastapi understøtter begge dele, og du kan genbruge et globalt klientobjekt, der er startet og sluttet med din app-proces.
Nogle kontekstdetaljer for (forhåbentlig) at afklare disse teknologier og deres relationer:
Den officielle MongoDB-driver til Python er pymongo. Under hætterne bruger både MongoEngine og Motor Pymongo. Pymongo implementerer en direkte klient til MongoDB (dæmoner) og tilbyder en Python API til at fremsætte anmodninger.
Hvis du ville, kunne du bruge pymongo med Fastapi direkte. (På den SQL-side af tingene ville dette svare til at bruge psycopg2 i Flask direkte uden at gå igennem noget som SQLAlchemy.)
MongoEngine er en ODM (Object-Document Mapper). Det tilbyder en Python objektorienteret API, som du kan bruge i din applikation til at arbejde mere komfortabelt, og når det kommer til de faktiske DB-anmodninger, vil MongoEngine bruge pymongo.
Motor er en indpakning til pymongo, der gør den ikke-blokerende (tillader async/afvent). Den bruger en event-loop, enten gennem Tornado eller gennem asyncio. Hvis du bruger Fastapi med uvicorn, vil uvicorn implementere async-funktionalitet med uvloop. Kort sagt, ved at bruge Motor med FastAPI, skulle async "bare fungere". Motor implementerer desværre ikke en ODM. I denne forstand minder det mere om pymongo.
Fastapi håndterer anmodninger fra klienter (ved hjælp af Starlette), men det vil lade dig implementere din egen forbindelse til MongoDB. Så du er ikke begrænset til noget bestemt valg, men du er for det meste på egen hånd (a la Flask).
Du kan bruge opstarts-/nedlukningskrogene på din FastAPI-app til at starte/stoppe din Motor/MongoEngine-klient. Du behøver ikke bekymre dig om, at dit klientobjekt ikke fortsætter på grund af problemer med flere processer, fordi Fastapi er enkelttrådet.
@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
Et eksempel på implementering af motor med Fastapi kan findes her.