Ik geloof dat je je antwoorden al hebt gekregen in de probleemforums van het Fastapi-project op Github:nummer 452 (gesloten). Maar ik zal de oplossingen hier samenvatten voor toekomstig gebruik:
Kortom, u kunt motor of mongoengine gebruiken, Fastapi ondersteunt beide en u kunt een globaal clientobject hergebruiken dat is gestart en beëindigd met uw app-proces.
Enkele contextdetails om (hopelijk) deze technologieën en hun relaties te verduidelijken:
Het officiële MongoDB-stuurprogramma voor Python is pymongo. Onder de motorkap gebruiken zowel MongoEngine als Motor Pymongo. Pymongo implementeert een directe client voor MongoDB (daemons) en biedt een Python API om verzoeken in te dienen.
Als je wilt, kun je pymongo rechtstreeks met Fastapi gebruiken. (Aan de SQL-kant van de zaak zou dit gelijk staan aan het rechtstreeks gebruiken van psycopg2 in Flask zonder iets als SQLAlchemy te doorlopen.)
MongoEngine is een ODM (Object-Document Mapper). Het biedt een objectgeoriënteerde Python-API die u in uw toepassing kunt gebruiken om comfortabeler te werken en als het gaat om de daadwerkelijke DB-verzoeken, zal MongoEngine pymongo gebruiken.
Motor is een wrapper voor pymongo die het niet-blokkerend maakt (waardoor async/wachten mogelijk is). Het maakt gebruik van een event-loop, hetzij via Tornado of via asyncio. Als u Fastapi met uvicorn gebruikt, zal uvicorn async-functionaliteit implementeren met uvloop. Kortom, als u Motor met FastAPI gebruikt, zou async "gewoon moeten werken". Helaas implementeert Motor geen ODM. In die zin lijkt het meer op pymongo.
Fastapi verwerkt de verzoeken van klanten (met behulp van Starlette), maar u kunt uw eigen verbinding met MongoDB implementeren. U bent dus niet beperkt tot een bepaalde keuze, maar u staat er grotendeels alleen voor (a la Flask).
U kunt de opstart-/afsluithaken van uw FastAPI-app gebruiken om uw Motor/MongoEngine-client te starten/stoppen. U hoeft zich geen zorgen te maken dat uw clientobject niet blijft bestaan vanwege problemen met meerdere processen, omdat Fastapi single-threaded is.
@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
Een voorbeeldimplementatie van motor met Fastapi is hier te vinden.