使用WSGI将模型更新从db发送到客户端

问题描述 投票:0回答:1

什么是通知客户端他们正在查看的模型表的更改的最轻量级方法?

我已经使用Django Rest Framework来设置一个API,为客户提供项目模板表,并允许他们动态更改买家。

目前,我使用带有setTimeout的重复jQuery AJAX请求2秒。即使没有变化,这也会发送大量请求和数据,并且网页规模不断增长。

我不得不禁用缓存,因为一些用户可能拥有IE11。

我开始寻找一种方法将更新推送到客户端,并开始探索Django频道和服务器发送事件。

Django频道

  • 构建了演示聊天应用程序
  • 非常快
  • Websockets是supported by all my target browsers
  • 对我正在努力实现的目标而言似乎有些过分。
  • 很多配置
  • 需要Redis或其他一些数据存储区
  • 我真的不需要双向沟通
  • 我的应用程序托管在Pythonanywhere上,它不允许ASGI,似乎没有任何计划(12)。

服务器已发送事件

目前,基于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);
    }
  });
}
...
...
python django django-rest-framework server-sent-events django-signals
1个回答
0
投票

我和Django频道一起去了,但后来切换到了pusher.com这对我来说效果很好,所以我觉得值得为你看一下。

© www.soinside.com 2019 - 2024. All rights reserved.