我可以向现有的 aiohttp ClientSession 添加自定义 TraceConfig 吗?

问题描述 投票:0回答:1

我有一个使用现有

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.
python python-3.x logging trace aiohttp
1个回答
0
投票

正如 @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)
© www.soinside.com 2019 - 2024. All rights reserved.