aiohttp - как сохранить постоянный сеанс в пространстве имен класса - PullRequest
0 голосов
/ 25 марта 2019

Я пытаюсь использовать 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 в пространстве имен классов и повторно использовать его.

Любая помощь будет принята с благодарностью.

1 Ответ

0 голосов
/ 26 марта 2019

Вот рабочий пример:

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())
...