【问题标题】:aiohttp / Getting response object out of context manageraiohttp / 从上下文管理器中获取响应对象
【发布时间】:2021-10-12 01:44:28
【问题描述】:

我目前正在使用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 

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

【问题讨论】:

  • 您不是必须等待回复才能返回吗? response_object = await response
  • 不,响应对象本身不能等待。只有它的某些方法(例如 text() 或 json() )需要等待
  • 啊,好的,感谢您清除它。
  • 出于好奇,当初为什么要退货?
  • 所以我不需要在主函数中打开上下文管理器,如果你有很多缩进块,它会变得非常混乱。但我现在可能不得不这样做

标签: python python-requests scope aiohttp


【解决方案1】:

如果您不关心在 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 首先检查正文是否已被读取。

【讨论】:

    猜你喜欢
    • 2017-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-06
    • 2021-12-31
    • 2019-01-22
    • 1970-01-01
    相关资源
    最近更新 更多