将 Django 服务器发送的事件与数据库一起使用 post 保存
Using Django Server Sent Events with Database post save
我正在尝试在 Django 框架中实现服务器发送事件 (SSE)。我很清楚我可以像这样实现 view
:
@csrf_exempt
def event_stream(request):
def eventStream():
yield "data:Server Sent Data\n\n"
response = HttpResponse(eventStream(), content_type="text/event-stream")
response['Cache-Control'] = 'no-cache'
return response
但我想在数据库 table 中创建新条目时触发 SSE 调用,来自 table 的 post_save
,我该如何实现因为 eventStream
这里是一个生成器函数。
阅读有关信号的信息。
https://docs.djangoproject.com/en/dev/topics/signals/
在这种情况下,您应该使用 request_started 和 post_save 信号
Django 是围绕 request/response 周期构建的,这意味着它不适用于 websockets 甚至 SSE。在您的示例中,除非您在视图中使用订阅队列(rabbitmq、redis pubsub)并在信号处理程序中发送数据,否则无法将 post_save 信号传播到视图。
考虑从服务器推送的其他解决方案:
- 长轮询
- Django channels
- 像 nodejs 或 tornado 这样的异步解决方案代替或与 Django 一起使用
我正在尝试在 Django 框架中实现服务器发送事件 (SSE)。我很清楚我可以像这样实现 view
:
@csrf_exempt
def event_stream(request):
def eventStream():
yield "data:Server Sent Data\n\n"
response = HttpResponse(eventStream(), content_type="text/event-stream")
response['Cache-Control'] = 'no-cache'
return response
但我想在数据库 table 中创建新条目时触发 SSE 调用,来自 table 的 post_save
,我该如何实现因为 eventStream
这里是一个生成器函数。
阅读有关信号的信息。 https://docs.djangoproject.com/en/dev/topics/signals/ 在这种情况下,您应该使用 request_started 和 post_save 信号
Django 是围绕 request/response 周期构建的,这意味着它不适用于 websockets 甚至 SSE。在您的示例中,除非您在视图中使用订阅队列(rabbitmq、redis pubsub)并在信号处理程序中发送数据,否则无法将 post_save 信号传播到视图。
考虑从服务器推送的其他解决方案:
- 长轮询
- Django channels
- 像 nodejs 或 tornado 这样的异步解决方案代替或与 Django 一起使用