У меня есть код, который использует существующий 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. Попробую заморозить. Спасибо
Как упомянул @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)
В документации показано, как передать его в ClientSession во время создания: docs.aiohttp.org/en/stable/client_advanced.html#client-tracing Хотя, похоже, это ошибка, которую трассировка_configs позволит добавлять позже, если это не так. желаемое поведение. Так что либо передайте его во время строительства, либо запустите
trace_config.freeze()
самостоятельно. Но что-то в aiohttp должно быть улучшено по этому поводу...