我有一个使用现有
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.
正如 @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)