Я пытаюсь использовать aiohttp в одном из моих проектов и пытаюсь выяснить, как создать постоянный объект aiohttp.ClientSession
.Я просмотрел официальную документацию по aiohttp, но не нашел в этом помощи.
Я просмотрел другие онлайн-форумы и заметил, что с момента создания aiohttp многое изменилось.В некоторых примерах на github показано, что автор aiohttp создает ClientSession
вне coroutine
функций (то есть class Session: def __init__(self): self.session = aiohttp.ClientSession()
).Я также обнаружил, что не следует создавать внешнюю сопрограмму 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.Я также заметил, что 2 из трех вызовов зависают, и мне нужно нажать CTRL + C.
С requests
я могу просто инициализировать объект session
в __init__
, но это не такпросто как это с aiohttp
.
Я не вижу никаких проблем, если я использую следующее (это то, что я вижу в качестве примера повсюду), но, к сожалению, здесь я в конечном итоге создаю ClientSession
с каждымrequest.
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
в пространстве имен классов и повторно использовать его.
Любая помощь будет принята с благодарностью.