Где хранить клиент базы данных в FastAPI?Python

Программы на Python
Ответить
Anonymous
 Где хранить клиент базы данных в FastAPI?

Сообщение Anonymous »

У меня есть приложение FastAPI с MongoDB, подключенное через Motor. Я открываю соединение MongoDB в начале приложения и закрываю его в конце, используя продолжительность жизни. Читая документацию и чужие репозитории на Github, я нашел 3 основных способа хранения клиента.
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
Но в Python крайне не рекомендуется использовать глобальные переменные.
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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»