【发布时间】:2020-11-28 16:18:12
【问题描述】:
Documentation for Django 3.1 谈到异步视图:
主要好处是能够在不使用 Python 线程的情况下为数百个连接提供服务。这允许您使用慢速流式传输、长轮询和其他令人兴奋的响应类型。
我相信“慢速流”意味着我们可以实现 SSE 视图,而无需为每个客户端独占一个线程,因此我尝试绘制一个简单的视图,如下所示:
async def stream(request):
async def event_stream():
while True:
yield 'data: The server time is: %s\n\n' % datetime.datetime.now()
await asyncio.sleep(1)
return StreamingHttpResponse(event_stream(), content_type='text/event-stream')
(注意:我改编了this response的代码)
不幸的是,当调用此视图时,它会引发以下异常:
Traceback (most recent call last):
File "/usr/local/lib/python3.7/site-packages/asgiref/sync.py", line 330, in thread_handler
raise exc_info[1]
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/exception.py", line 38, in inner
response = await get_response(request)
File "/usr/local/lib/python3.7/site-packages/django/core/handlers/base.py", line 231, in _get_response_async
response = await wrapped_callback(request, *callback_args, **callback_kwargs)
File "./chat/views.py", line 144, in watch
return StreamingHttpResponse(event_stream(), content_type='text/event-stream')
File "/usr/local/lib/python3.7/site-packages/django/http/response.py", line 367, in __init__
self.streaming_content = streaming_content
File "/usr/local/lib/python3.7/site-packages/django/http/response.py", line 382, in streaming_content
self._set_streaming_content(value)
File "/usr/local/lib/python3.7/site-packages/django/http/response.py", line 386, in _set_streaming_content
self._iterator = iter(value)
TypeError: 'async_generator' object is not iterable
对我来说,这表明 StreamingHttpResponse 目前不支持异步生成器。
我尝试将StreamingHttpResponse 修改为使用async for,但我做不到很多。
知道我该怎么做吗?
【问题讨论】:
-
我 99% 确定它不受支持,因为响应对象中没有任何内容是
awaitable。 -
@BenoitBlanchon 那么你的实际目标是什么?是否有一些页面会逐块生成响应(用于大响应),或者有能力在其他事件发生时异步发送 SSE(服务器端事件)?还是完全不同的东西?因为我从您的问题中看到了固定的
StreamingHttpResponse,但您仍然没有接受该回复。 -
我的目标是发送 SSE,我会接受第一个有效的响应。
标签: python django server-sent-events