Повторное использование сессии в aiohhttp - PullRequest
0 голосов
/ 27 сентября 2018

Я пытаюсь повторно использовать HTTP-сессию в качестве совета по aiohttp

Не создавать сеанс для запроса.Скорее всего вам нужен сеанс для приложения, который выполняет все запросы в целом.

Но обычный шаблон, который я использую с запросами lib, не работает:

def __init__(self):
    self.session = aiohttp.ClientSession()

async def get_u(self, id):
    async with self.session.get('url') as resp:
        json_resp = await resp.json()

        return json_resp.get('data', {})

Затем я пытаюсь

await client.get_u(1)

Я получил ошибку

RuntimeError: Timeout context manager should be used inside a task

Любые обходные пути с async_timeout не помогли.

Другой способ работает:

async def get_u(self, id):
    async with aiohttp.ClientSession() as session:
        with async_timeout.timeout(3):
            async with session.get('url') as resp:
                json_resp = await resp.json()
                return json_resp.get('data', {})

Но похоже на создание сессии по запросу.
Итак, мой вопрос: как правильно повторно использовать aiohttp-сессию?

UPD: минимальный рабочий пример.Sanic приложение со следующим видом

import aiohttp
from sanic.views import HTTPMethodView


class Client:
    def __init__(self):
        self.session = aiohttp.ClientSession()
        self.url = 'https://jsonplaceholder.typicode.com/todos/1'

    async def get(self):
        async with self.session.get(self.url) as resp:
            json_resp = await resp.json()

            return json_resp


client = Client()


class ExView(HTTPMethodView):
    async def get(self, request):
        todo = await client.get()
        print(todo)

1 Ответ

0 голосов
/ 28 сентября 2018

Например, вы можете создать ClientSession при запуске приложения (используя on_startup сигнал https://docs.aiohttp.org/en/stable/web_advanced.html#signals). Сохранить его в своем приложении (приложение aiohttp имеет интерфейс dict для таких проблем https://aiohttp.readthedocs.io/en/stable/faq.html#id4) и получить доступ кВаш сеанс через request.app['YOU_CLIENT_SESSION'] в запросе.

...