1. Внедрение зависимостей с глобальными переменными
Код: Выделить всё
from contextlib import asynccontextmanager
from fastapi import FastAPI, Depends
from motor.motor_asyncio import AsyncIOMotorClient, AsyncIOMotorDatabase
mongo_client = None
def init_db():
global mongo_client
mongo_client = AsyncIOMotorClient("mongo://")
def get_db():
return mongo_client["mydb"]
def close_db():
mongo_client.close()
@asynccontextmanager
async def lifespan(app):
init_db()
yield
close_db()
app = FastAPI(lifespan=lifespan)
@app.get("/")
async def root(db: Annotated[AsyncIOMotorDatabase, Depends(get_db)]):
return db
2. Внедрение зависимостей с помощью шаблона Singleton
По сути, то же самое, что и глобальные переменные. Все плюсы и минусы глобальных переменных. Также антипаттерн в качестве глобальных переменных.
3. Сохранение базы данных в состоянии жизненного цикла
Есть другой способ хранения клиента базы данных, который находится в состоянии жизненного цикла, и тогда он будет помечен при каждом запросе (если я правильно понимаю) и может можно прочитать оттуда:
Код: Выделить всё
from contextlib import asynccontextmanager
from fastapi import FastAPI, Request
from motor.motor_asyncio import AsyncIOMotorClient
@asynccontextmanager
async def lifespan(app):
mongo_client = AsyncIOMotorClient("mongo://")
mongo_db = mongo_client["mydb"]
yield {"db": mongo_db}
mongo_client.close()
app = FastAPI(lifespan=lifespan)
@app.get("/")
async def root(request: Request):
return request.state.db
Внедрение зависимостей кажется более подходящим для этого варианта использования, но на практике для этого требуются глобальные переменные. (если только я не использую какой-нибудь ORM, который будет хранить для меня ссылку на базу данных).
Какова наилучшая практика?
Подробнее здесь: https://stackoverflow.com/questions/792 ... in-fastapi
Мобильная версия