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')
(注意: 我修改了代码,参考了这个回答)
不幸的是,当该视图被调用时,会引发以下异常:
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
,但是我并没有做太多工作。
您有任何想法我该怎么做吗?