Где инициализировать aiohttp.Сеанс работы с клиентами в потоковом приложении faust

#python #aiohttp #kafka-python #faust

Вопрос:

Я пытаюсь создать aiohttp.ClientSession внутри своего приложения faust, чтобы я мог повторно использовать его, не предоставляя заголовки аутентификации снова и снова. Если я унаследую faust.app

 class FaustApplication(faust.App):
    jcm_session: Optional[aiohttp.ClientSession] = None

    def __init__(self, *args, **kwargs) -> None:
        super().__init__(*args, **kwargs)
   
        self.aiohttp_session = aiohttp.ClientSession(
            base_url='REDACTED',
            headers={
                'Authorization': f'{get_credentials()}',
                'Content-Type': 'application/json',
            },
        )
 

а затем также определите тестовое представление (которое должно извлекать некоторые данные из службы, определенной в этом сеансе).:

 @app.page('/test')
async def test(self, request):
    res = await app.aiohttp_session.get('/api/test/')
    # do some post-processing with res
    return res
 

При попытке использовать его я получаю следующую ошибку:

 [2021-11-08 09:08:48,165] [4221] [ERROR] Error handling request 
Traceback (most recent call last):
  File "/home/username/git/projectname/.venv/lib/python3.7/site-packages/aiohttp/web_protocol.py", line 430, in _handle_request
    resp = await request_handler(request)
  File "/home/username/git/projectname/.venv/lib/python3.7/site-packages/aiohttp/web_app.py", line 504, in _handle
    resp = await handler(request)
  File "/home/username/git/projectname/.venv/lib/python3.7/site-packages/faust/web/drivers/aiohttp.py", line 247, in _dispatch
    return await handler(request)
  File "/home/username/git/projectname/.venv/lib/python3.7/site-packages/faust/web/views.py", line 82, in __call__
    return await self.dispatch(request)
  File "/home/username/git/projectname/.venv/lib/python3.7/site-packages/faust/web/views.py", line 98, in dispatch
    response = await method(cast(Request, request), **kwargs)
  File "/home/username/git/projectname/worker/actions/config_backup.py", line 40, in get_config_backup
    response = await app.aiohttp_session.get('/api/test')
  File "/home/username/git/projectname/.venv/lib/python3.7/site-packages/aiohttp/client.py", line 466, in _request
    with timer:
  File "/home/username/git/projectname/.venv/lib/python3.7/site-packages/aiohttp/helpers.py", line 699, in __enter__
    "Timeout context manager should be used " "inside a task"
RuntimeError: Timeout context manager should be used inside a task
 

Как я могу сделать свой HTTP-сеанс доступным внутри представления, созданного фаустом? Обратите внимание, что он работает, если его вызывает агент или таймер, но не из представления. Вероятно, у представления есть свой собственный цикл, но я не уверен, что здесь лучше всего.

Дополнительный вопрос: является ли конструктор лучшим местом для инициализации этого сеанса? Я пытался создать self.on_startup_finished метод, но по какой — то причине он никогда не вызывается.

Спасибо.