engine.middlewares — Ready-to-use middleware for Aiogram
ContainerMiddleware
Обязательная мидлварь, которая внедряет DI-контейнер в контекст каждого запроса.
ContainerMiddleware
Bases: BaseMiddleware
Middleware for injecting the Dependency Injection container.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
container
|
ContainerProtocol
|
Object implementing ContainerProtocol. |
required |
Source code in src/codex_bot/engine/middlewares/container.py
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | |
Functions
__call__(handler, event, data)
async
Injects the container into the context data.
Source code in src/codex_bot/engine/middlewares/container.py
33 34 35 36 37 38 39 40 41 | |
UserValidationMiddleware
Первичная проверка пользователя по БД/Кэшу. Управляет бан-листами и обновляет статус активности.
UserValidationMiddleware
Bases: BaseMiddleware
Middleware for validating users and injecting RBAC data.
Key features:
- Universal: Supports all update types via 'event_from_user'.
- RBAC: Injects is_admin flag using ContainerProtocol.
- Safe: Handles events without an associated user.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
container
|
ContainerProtocol
|
Object implementing ContainerProtocol for admin checks. |
required |
Source code in src/codex_bot/engine/middlewares/user_validation.py
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | |
Functions
__call__(handler, event, data)
async
Processes the incoming event.
Source code in src/codex_bot/engine/middlewares/user_validation.py
38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | |
ThrottlingMiddleware
Защита от спама (Rate Limit). Использует Redis для контроля частоты запросов.
ThrottlingMiddleware
Bases: BaseMiddleware
Rate limiting middleware via atomic Redis SET NX.
One network request instead of two (EXISTS + SET). Atomicity eliminates race conditions during parallel updates.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
redis
|
Any
|
Async Redis client ( |
required |
rate_limit
|
float
|
Minimum interval between requests in seconds.
Supports fractional values (e.g., |
1.0
|
Example
from redis.asyncio import Redis
from codex_bot.engine.middlewares import ThrottlingMiddleware
redis = Redis.from_url("redis://localhost")
builder.add_middleware(ThrottlingMiddleware(redis=redis, rate_limit=0.5))
Source code in src/codex_bot/engine/middlewares/throttling.py
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | |
DirectorMiddleware
Автоматическая инициализация объекта Director для текущего запроса.
DirectorMiddleware
Bases: BaseMiddleware
Middleware that injects a Director instance into the handler data.
Uses 'ContextHelper' to normalize IDs from different event types.
Depends on:
- ContainerMiddleware (for data["container"])
- state (provided by aiogram Dispatcher/FSM)
Source code in src/codex_bot/engine/middlewares/director_middleware.py
23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 | |
DatabaseTransactionMiddleware
Автоматическое создание и фиксация транзакции SQLAlchemy для каждого запроса.
DatabaseTransactionMiddleware
Bases: BaseMiddleware
Middleware for managing the lifecycle of an async database session.
Injects data["db_session"] into the handler context.
Source code in src/codex_bot/engine/middlewares/database.py
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | |
Functions
__init__(session_maker)
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
session_maker
|
async_sessionmaker[AsyncSession]
|
SQLAlchemy async_sessionmaker instance. |
required |
Source code in src/codex_bot/engine/middlewares/database.py
27 28 29 30 31 32 | |
FSMContextI18nManager
Управление локализацией на основе данных FSM.
FSMContextI18nManager
Bases: BaseManager
Language manager via FSM storage (Redis).
Locale determination priority: 1. FSM storage (key "locale") — user explicitly selected a language. 2. Telegram language_code — if it's in the allowed_locales list. 3. default_locale — fallback.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
allowed_locales
|
list[str] | None
|
List of allowed language codes (e.g., ["ru", "en", "de"]). |
None
|
default_locale
|
str
|
Default language if nothing matches. |
'en'
|
Example
from aiogram_i18n import I18nMiddleware
from aiogram_i18n.cores import FluentRuntimeCore
i18n = I18nMiddleware(
core=FluentRuntimeCore(path="locales/{locale}"),
manager=FSMContextI18nManager(allowed_locales=["ru", "en"], default_locale="en"),
default_locale="en",
)
i18n.setup(dp)
Source code in src/codex_bot/engine/middlewares/i18n.py
22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 | |
Functions
get_locale(event_from_user=None, **kwargs)
async
Determines the user's current locale.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
event_from_user
|
User | None
|
Telegram user. |
None
|
**kwargs
|
Any
|
aiogram-i18n context (includes "state"). |
{}
|
Returns:
| Type | Description |
|---|---|
str
|
String locale code (e.g., "ru"). |
Source code in src/codex_bot/engine/middlewares/i18n.py
57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 | |
set_locale(locale, **kwargs)
async
Saves the selected locale to FSM.
Parameters:
| Name | Type | Description | Default |
|---|---|---|---|
locale
|
str
|
Language code to save. |
required |
**kwargs
|
Any
|
Context (includes "state"). |
{}
|
Source code in src/codex_bot/engine/middlewares/i18n.py
81 82 83 84 85 86 87 88 89 90 91 | |