Оптимизация и улучшение middleware и обработки сессий базы данных

- Рефакторинг middlewares с добавлением типизации и улучшенной логики
- Оптимизация SessionMiddleware с использованием пула соединений
- Улучшение обработки пользователей и логирования в UserMiddleware
- Расширение функциональности ThrottlingMiddleware с более гибким управлением
- Добавление дополнительных проверок и логирования в AdminMiddleware
- Оптимизация функции upsert_user с поддержкой передачи существующей сессии
This commit is contained in:
izzzzzi
2025-02-25 02:39:44 +05:00
parent e3a9ff4dfd
commit b08040f46b
7 changed files with 225 additions and 83 deletions
+20 -5
View File
@@ -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