首页 > 解决方案 > aiohttp / 从上下文管理器中获取响应对象

问题描述

我目前正在aiohttp(来自requests模块)做我的第一个“婴儿步骤”。

我试图稍微简化请求,这样我就不必为我的主模块中的每个请求使用上下文管理器。

因此我尝试了这个:

async def get(session, url, headers, proxies=None):
  async with session.get(url, headers=headers, proxy=proxies) as response:
       response_object = response
  return response_object

但结果是:

<class 'aiohttp.client_exceptions.ClientConnectionError'> - Connection closed 

该请求在上下文管理器中可用。当我尝试在上述函数的上下文管理器中访问它时,一切正常。
但是它不应该也可以保存在变量中<response_object>然后返回,以便我可以在上下文管理器之外访问它吗?
有什么解决方法吗?

标签: pythonpython-requestsscopeaiohttp

解决方案


如果您不关心在get方法期间加载的数据,也许您可​​以尝试在其中加载它:

async def get(session, url, headers, proxies=None):
      async with session.get(url, headers=headers, proxy=proxies) as response:
          await response.read()
      return response

并且使用的正文如下:

resp = get(session, 'http://python.org', {})
print(await resp.text())

在后台,该read方法将正文缓存在一个名为的成员中_body,当尝试调用时json,aiohttp 首先检查正文是否已被读取。


推荐阅读