#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
метод, но по какой — то причине он никогда не вызывается.
Спасибо.