aiohttp - 如何在类命名空间中保存持久会话

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

我试图在我的一个项目中使用aiohttp,并努力弄清楚如何创建一个持久的aiohttp.ClientSession对象。我已经阅读了官方的aiohttp文档,但在这方面没有找到帮助。

我已经浏览了其他在线论坛,并注意到自创建aiohttp以来已经发生了很多变化。在github的一些例子中,aiohttp作者被证明是在ClientSession函数(即coroutine)之外创建一个class Session: def __init__(self): self.session = aiohttp.ClientSession()。我还发现不应该在coroutine之外创建一个ClientSession

我尝试过以下方法:

class Session:
    def __init__(self):
        self._session = None

    async def create_session(self):
        self._session = aiohttp.ClientSession()

    async fetch(self, url):
        if self._session is None:
            await self.create_session()
        async with self._session.get(url) as resp:
            return await resp.text()

我收到很多关于UnclosedSession和连接器的警告。我也经常得到SSLError。我还注意到有三分之二的呼叫被挂起,我必须用CTRL + C来杀死它。

使用requests,我可以简单地初始化session中的__init__对象,但它并不像aiohttp那样简单。

我没有看到任何问题,如果我使用以下(这是我在整个地方看到的例子)但不幸的是在这里我最终创建ClientSession与每个请求。

def fetch(url):
    async with aiohttp.ClientSession() as session:
        async with session.get(url) as resp:
            return await resp.text()

我可以将aiohttp.ClientSession()包装在另一个函数中并将其用作上下文管理器,但是每次调用包装函数时我最终都会创建一个新的session对象。我试图想出如何在类命名空间中保存aiohttp.ClientSession并重用它。

任何帮助将不胜感激。

python-3.7 aiohttp
1个回答
0
投票

这是工作示例:

from aiohttp import ClientSession, TCPConnector
import asyncio


class CS:

    _cs: ClientSession

    def __init__(self):
        self._cs = ClientSession(connector=TCPConnector(verify_ssl=False))

    async def get(self, url):
        async with self._cs.get(url) as resp:
            return await resp.text()

    async def close(self):
        await self._cs.close()


async def func():
    cs = CS()
    print(await cs.get('https://google.com'))
    await cs.close()  # you must close session


loop = asyncio.get_event_loop()
loop.run_until_complete(func())
© www.soinside.com 2019 - 2024. All rights reserved.