Оптимизация и улучшение middleware и обработки сессий базы данных
- Рефакторинг middlewares с добавлением типизации и улучшенной логики - Оптимизация SessionMiddleware с использованием пула соединений - Улучшение обработки пользователей и логирования в UserMiddleware - Расширение функциональности ThrottlingMiddleware с более гибким управлением - Добавление дополнительных проверок и логирования в AdminMiddleware - Оптимизация функции upsert_user с поддержкой передачи существующей сессии
This commit is contained in:
+20
-5
@@ -1,5 +1,5 @@
|
||||
from collections.abc import Awaitable, Callable
|
||||
from typing import Any
|
||||
from typing import Any, Optional
|
||||
|
||||
import asyncpg
|
||||
from aiogram import BaseMiddleware
|
||||
@@ -9,15 +9,30 @@ from config import DATABASE_URL
|
||||
|
||||
|
||||
class SessionMiddleware(BaseMiddleware):
|
||||
pool: Optional[asyncpg.Pool] = None
|
||||
|
||||
async def __call__(
|
||||
self,
|
||||
handler: Callable[[TelegramObject, dict[str, Any]], Awaitable[Any]],
|
||||
event: TelegramObject,
|
||||
data: dict[str, Any],
|
||||
) -> Any:
|
||||
conn = await asyncpg.connect(DATABASE_URL)
|
||||
try:
|
||||
# Создаем пул соединений при первом вызове
|
||||
if self.pool is None:
|
||||
self.pool = await asyncpg.create_pool(
|
||||
DATABASE_URL,
|
||||
min_size=5,
|
||||
max_size=20
|
||||
)
|
||||
|
||||
# Получаем соединение из пула
|
||||
async with self.pool.acquire() as conn:
|
||||
data["session"] = conn
|
||||
return await handler(event, data)
|
||||
finally:
|
||||
await conn.close()
|
||||
|
||||
@classmethod
|
||||
async def close(cls) -> None:
|
||||
"""Закрыть пул соединений при завершении работы приложения."""
|
||||
if cls.pool is not None:
|
||||
await cls.pool.close()
|
||||
cls.pool = None
|
||||
|
||||
Reference in New Issue
Block a user