如何使用Python(Django)进行SSE?

时间:2019-01-23 11:44:15

标签: python django django-models server-sent-events

我有两个不同的页面,一个(A)显示从模型对象获取的数据,另一个(B)更改其字段。 我希望将发布数据从B发送到服务器时,服务器更改A中的值。 最好的方法是什么?

该示例可能对我有用,但是它在PHP中...有一种方法可以用Python复制它吗? https://www.w3schools.com/html/html5_serversentevents.asp

3 个答案:

答案 0 :(得分:1)

正如其他答案中提到的,您需要使用 Django Channels 来正确处理异步通信,而不会占用线程。

有关示例,请参阅 the django-eventstream library,它使用 Channels 实现 SSE。

答案 1 :(得分:0)

这是Django中w3schools的有效示例:

模板

<!DOCTYPE html>
<html>
<body>

<h1>Getting server updates</h1>
<div id="result"></div>

<script>
if(typeof(EventSource) !== "undefined") {
  var source = new EventSource("stream/");
  source.onmessage = function(event) {
    document.getElementById("result").innerHTML += event.data + "<br>";
  };
} else {
  document.getElementById("result").innerHTML = "Sorry, your browser does not support server-sent events...";
}
</script>

</body>
</html>

观看次数

import datetime
from django.http import HttpResponse

def stream(request):
    return HttpResponse(
        'data: The server time is: %s\n\n' % datetime.datetime.now(),
        content_type='text/event-stream'
    )

网址

urlpatterns = [
    path('stream/', views.stream, name='stream')
]

答案 2 :(得分:0)

阅读this后,我认为我理解了所有内容(如果我记错了,请发表评论)。

Django本身不支持保持活动连接。这意味着,当客户端从服务器获取消息时,连接将在之后立即关闭(就像任何传统的HTTP请求/响应周期一样)。

text/event-stream请求的不同之处在于,客户端每秒自动尝试重新连接到服务器(可以使用retry参数来更改长度)。

不幸的是,在那种情况下使用SSE似乎没有兴趣,因为它具有与轮询相同的缺点(即,请求/响应周期每X秒发生一次)。

正如其他答案中所预期的那样,我将需要django-channels创建一个持久连接,以防止HTTP请求/响应的开销并确保立即发送消息。