diff --git a/solutions/69a86305c46fd26feae6bcaa_Human-in-the-Loop_через_middleware/solution.py b/solutions/69a86305c46fd26feae6bcaa_Human-in-the-Loop_через_middleware/solution.py new file mode 100644 index 0000000..e4b7a7b --- /dev/null +++ b/solutions/69a86305c46fd26feae6bcaa_Human-in-the-Loop_через_middleware/solution.py @@ -0,0 +1,55 @@ +# Human-in-the-Loop Middleware +# +# В этом примере реализован простой middleware, который позволяет +# вставлять человека в цикл обработки запросов. Он может быть использован +# в веб‑приложениях, чат‑ботах и других системах, где требуется +# ручная проверка или подтверждение. + +from typing import Callable, Any, Dict + +class HumanInTheLoopMiddleware: + """ + Middleware, который вызывает функцию‑обработчик для + каждого запроса. Если обработчик возвращает ``False`` + (или ``None``), запрос считается отклонённым и + передаётся в ручную обработку. + """ + + def __init__(self, handler: Callable[[Dict[str, Any]], bool]): + self.handler = handler + + def __call__(self, request: Dict[str, Any]) -> Dict[str, Any]: + # Предварительная проверка + approved = self.handler(request) + if not approved: + # Запрос отправляется в ручную обработку + # В реальном проекте здесь может быть вызов внешнего сервиса + # или отправка письма/сообщения в чат. + return { + "status": "pending", + "reason": "human review required", + "original": request, + } + # Если проверка пройдена – продолжаем обработку + return { + "status": "approved", + "original": request, + } + +# Пример простого обработчика, который проверяет наличие ключа "approve" +# в запросе. Если ключ отсутствует – запрос отклоняется. + +def simple_handler(request: Dict[str, Any]) -> bool: + return request.get("approve", False) + +# Пример использования +if __name__ == "__main__": + middleware = HumanInTheLoopMiddleware(simple_handler) + + # Запрос, который будет отклонён + req1 = {"id": 1, "data": "test"} + print(middleware(req1)) + + # Запрос, который будет одобрен + req2 = {"id": 2, "data": "test", "approve": True} + print(middleware(req2))