Cделал мидлевары для json api сервиса на aiohttp.

1. Простая мидлевара, сигнатура обработчика должна быть такой:
 async def some_handler(request: web.Request, data: Any) -> Any:
(вместо Any у data надо, конечно, ставить нужную аннотацию,.. аргументы обработчика - позиционные)

2. Мидлевара для произвольных аргументов у обработчиков, примеры объявлений обработчиков:
 async def some_handler_1(data: dict) -> int:
    # ...
    return some_data
async def some_handler_2(storage: StorageClass, data: List[int]) -> dict:
    # ...
    return some_data
async def some_handler_3(
    data: Union[dict, List[str]], logger: LoggerClass, request: web.Request
) -> str:
    # ...
    return some_data
(аргументы должны иметь аннотации)

3. Мидлевара с оболочками для запросов и ответов, и валидацией данных (может наследоваться и от 1-й и от 2-й)

Ссылка:
https://github.com/EvgeniyBurdin/api_service/tree/main

Есть докер - можно быстро запустить и посмотреть в работе.