Могу ли я добавить собственный TraceConfig к существующему клиентскому сеансу aiohttp?

У меня есть код, который использует существующий aiohttp.ClientSession. Я хочу добавить пользовательскую трассировку для этого сеанса.

Пробовал сделать что-то вроде (не работает):

from aiohttp import ClientSession, TraceConfig

async def on_request_start_debug(
        session: aiohttp.ClientSession,
        context, params: aiohttp.TraceRequestStartParams):
    logger.debug(f'HTTP {params.method}: {params.url}')


class MyClient:
    def __init__(self, session: ClientSession):
        trace_config = TraceConfig()
        trace_config.on_request_start.append(on_request_start_debug)
        session.trace_configs.append(trace_config)
        
        self._session = session
        # ...
        # ...

Но когда я пытаюсь его запустить - получаю RuntimeError: Cannot send non-frozen signal.:

...
    resp = await session.get(url=url, headers=headers, timeout=timeout)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".../python3.12/site-packages/aiohttp/client.py", line 500, in _request
    await trace.send_request_start(method, url.update_query(params), headers)
  File ".../python3.12/site-packages/aiohttp/tracing.py", line 356, in send_request_start
    return await self._trace_config.on_request_start.send(
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File ".../python3.12/site-packages/aiosignal/__init__.py", line 33, in send
    raise RuntimeError("Cannot send non-frozen signal.")
RuntimeError: Cannot send non-frozen signal.

В документации показано, как передать его в ClientSession во время создания: docs.aiohttp.org/en/stable/client_advanced.html#client-traci‌​ng Хотя, похоже, это ошибка, которую трассировка_configs позволит добавлять позже, если это не так. желаемое поведение. Так что либо передайте его во время строительства, либо запустите trace_config.freeze() самостоятельно. Но что-то в aiohttp должно быть улучшено по этому поводу...

Sam Bull 09.04.2024 16:03

Да, но в моей ситуации я не контролирую построение ClientSession. Попробую заморозить. Спасибо

GuyKhmel 09.04.2024 20:02
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
2
52
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как упомянул @sam-bull в своем комментарии, документация и предложение заключаются в создании и изменении TraceConfig во время строительства.

Мой случай является крайним, и к этому ответу следует относиться с осторожностью.

Кажется, проблема в моем случае заключалась в том, что объект TraceConfig не был заморожен, тогда как обработчики list[TraceConfig] в client_session.trace_configs ожидают, что все TraceConfig будут заморожены.

Итак, я просто использовал trace_config.freeze().

то есть:

        trace_config = aiohttp.TraceConfig()
        trace_config.on_request_start.append(on_request_start_debug)
        trace_config.freeze()
        session.trace_configs.append(trace_config)

Другие вопросы по теме