b08040f46b
- Рефакторинг middlewares с добавлением типизации и улучшенной логики - Оптимизация SessionMiddleware с использованием пула соединений - Улучшение обработки пользователей и логирования в UserMiddleware - Расширение функциональности ThrottlingMiddleware с более гибким управлением - Добавление дополнительных проверок и логирования в AdminMiddleware - Оптимизация функции upsert_user с поддержкой передачи существующей сессии
39 lines
1.2 KiB
Python
39 lines
1.2 KiB
Python
from collections.abc import Awaitable, Callable
|
|
from typing import Any, Optional
|
|
|
|
import asyncpg
|
|
from aiogram import BaseMiddleware
|
|
from aiogram.types import TelegramObject
|
|
|
|
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:
|
|
# Создаем пул соединений при первом вызове
|
|
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)
|
|
|
|
@classmethod
|
|
async def close(cls) -> None:
|
|
"""Закрыть пул соединений при завершении работы приложения."""
|
|
if cls.pool is not None:
|
|
await cls.pool.close()
|
|
cls.pool = None
|