我有两个不同的页面,一个(A)显示从模型对象获取的数据,一个(B)更改其字段。我希望当发布数据从B发送到服务器时,服务器会更改A中的值。最佳方法是什么?
这个例子对我有用,但它在PHP中......有一种方法可以用Python复制它吗? https://www.w3schools.com/html/html5_serversentevents.asp
这是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')
]
更新:
如果您想管理通知,可以创建如下模型:
from django.db import models
class Notification(models.Model):
text = models.CharField(max_length=200)
user = models.ForeignKey(User, on_delete=models.CASCADE)
sent = models.BooleanField(default=False)
然后创建正在查找第一个未发送通知的视图并将其发送:
@login_required
def stream(request):
notification = Notification.objects.filter(
sent=False, user=request.user
).first()
text = ''
if notification:
text = notification.text
notification.sent = True
notification.save()
return HttpResponse(
'data: %s\n\n' % text,
content_type='text/event-stream'
)
send_notification
函数在Notification
模型中创建一个条目(只需在代码中的任何位置调用此函数):
def send_notification(user, text):
Notification.objects.create(
user=user, text=text
)
就是这样,就这么简单。
在阅读this之后,我想我理解了整个事情(如果我错了请评论)。
Django本身不支持keep-alive连接。这意味着,当客户端从服务器获取消息时,连接会立即关闭(就像任何经典的HTTP请求/响应周期一样)。
与text/event-stream
请求有什么不同,是客户端每秒自动尝试重新连接到服务器(可以使用retry
参数更改长度)。
不幸的是,在这种情况下似乎使用SSE没有兴趣,因为它具有与轮询相同的con(即每X秒发生一次请求/响应周期)。
正如预期的那样,在其他答案中提到,我需要django-channels来创建一个持久连接,以防止HTTP请求/响应开销,并确保立即发送消息。