我试图在我的一个项目中使用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
并重用它。
任何帮助将不胜感激。
这是工作示例:
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())