使用WSGI将模型更新从db发送到客户端
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用WSGI将模型更新从db发送到客户端相关的知识,希望对你有一定的参考价值。
什么是通知客户端他们正在查看的模型表的更改的最轻量级方法?
我已经使用Django Rest Framework来设置一个API,为客户提供项目模板表,并允许他们动态更改买家。
目前,我使用带有setTimeout的重复jQuery AJAX请求2秒。即使没有变化,这也会发送大量请求和数据,并且网页规模不断增长。
我不得不禁用缓存,因为一些用户可能拥有IE11。
我开始寻找一种方法将更新推送到客户端,并开始探索Django频道和服务器发送事件。
Django频道
- 构建了演示聊天应用程序
- 非常快
- Websockets是supported by all my target browsers
- 对我正在努力实现的目标而言似乎有些过分。
- 很多配置
- 需要Redis或其他一些数据存储区
- 我真的不需要双向沟通
- 我的应用程序托管在Pythonanywhere上,它不允许ASGI,似乎没有任何计划(1,2)。
服务器已发送事件
- 关于如何为Django配置它的信息很少
- No native support in IE11 or Edge,但有polyfills available
- 发现并测试了working example from stackoverflow,虽然不确定它在做什么。网页每5秒更新一次,不确定控制的位置。
- 设置很少,看起来几乎是神奇的
- 似乎在Django中将它与post_save signal一起使用是理想的,但我无法弄清楚如何设置它。
目前,基于AJAX的设置:
models.朋友
...
...
class Buyer(models.Model):
name = models.CharField(unique=True, max_length = 20)
class Item(models.Model):
name = models.CharField(unique=True, max_length = 50)
active = models.BooleanField(default=True)
bought_by = models.ForeignKey(Buyer, null=True, blank=True, to_field="name",)
views.朋友
...
...
class ItemViewSet(viewsets.ModelViewSet):
queryset = models.Item.objects.select_related("bought_by")
serializer_class= serializers.ItemSerializer
filterset_fields = ("bought_by")
renderer_classes = [renderers.JSONRenderer, renderers.BrowsableAPIRenderer, renderers.TemplatehtmlRenderer]
def list(self, request, *args, **kwargs):
queryset = self.filter_queryset(self.get_queryset())
if request.accepted_renderer.format == "html":
items = list()
for item in queryset:
items.append({"serializer": self.get_serializer(item), "item": item})
return Response(
{
"items_info": items,
"style": {"template_pack": "rest_framework/inline/"},
},
template_name="myapp/items_list.html",
)
else:
page = self.paginate_queryset(queryset)
if page is not None:
serializer = self.get_serializer(page, many=True)
return self.get_paginated_response(serializer.data)
serializer = self.get_serializer(queryset, many=True)
return Response(serializer.data)
...
...
(列表方法被客户修改为make each item editable)
handler.js
...
...
$.ajaxSetup({
cache: false
});
var tableUpdater = null;
var updateRequest = null;
// helper that can be called to cancel active timer/ajax in the
// case of interaction with buttons/selects on the page or
// in the case of a new request
function stopUpdate() {
if (tableUpdater || updateRequest) {
clearTimeout(tableUpdater);
updateRequest.abort();
}
}
// Update data table
function tableUpdate() {
stopUpdate();
updateRequest = $.ajax({
type: "GET",
url: "myapp/items/?format=html",
success: function(data) {
$("#activeRequests").html(data);
// schedule another AJAX request
tableUpdater = setTimeout(tableUpdate, 2000);
}
});
}
...
...
答案
我和Django频道一起去了,但后来切换到了pusher.com这对我来说效果很好,所以我觉得值得为你看一下。
以上是关于使用WSGI将模型更新从db发送到客户端的主要内容,如果未能解决你的问题,请参考以下文章