如何在需要时自动更新Django页面?

2 投票
1 回答
4951 浏览
提问于 2025-04-15 16:51

在这个链接中提到的内容是关于如何在Django中更新网页而不重新加载页面。我通过JavaScript定期向服务器发送XMLHTTP请求,以获取在我的应用程序运行过程中会变化的网页部分。

不过,大多数时候,实际上并没有什么变化;服务器返回的内容和之前一样,浏览器更新的网页内容也是之前已经有的。

显然,服务器应该只在有新数据时才回复。

我在网上查找了一些资料,发现了一个链接,但里面的说明很简略,我在我的Django项目中实现这个概念时遇到了困难。我很难相信这个问题之前没有人解决过。

有没有人知道其他可以作为参考的资源?

1 个回答

9

回答这个问题的难点在于不知道服务器端返回给用户的资源是什么。

我来举个例子。假设你正在开发一个应用,可以实时监控用户在你网站上发表的评论。为了实现这个功能,我们可以做几件事情:

  1. 服务器记录评论添加的时间(.created字段)
  2. 获取最新评论的接口需要我们指定想要多旧的评论
  3. 视图查询并返回自那时以来添加的评论

models.py

class Comment(models.Model):
    text = models.TextField()
    created = models.DateTimeField(default=datetime.now())

urls.py

url(r'^comments/latest/(?P<seconds_old>\d+)/$',get_latest_comments),

views.py

def get_latest_comments(request, seconds_old):
    """
    Returns comments that have been created since the last given number of seconds
    have elapsed.
    """

    # Query comments since the past X seconds
    comments_since = datetime.datetime.now() - datetime.timedelta(seconds=seconds_old)
    comments = Comments.objects.filter(created__gte=comments_since)

    # Return serialized data or whatever you're doing with it
    return HttpResponse(simplejson.dumps(comments),mimetype='application/json')

在客户端,你会得到JSON数据,检查它是否有值,如果有,就遍历这些项目,并把新项目添加到你的 <div> 标签或其他地方。


正如你所看到的,开发一个只返回最近更新项目的API,具体实现会根据服务器返回的内容而有所不同。

从你的问题来看,你希望服务器来管理识别哪些是最近更新的,而不是客户端(这是个不错的策略)。在这种情况下,你需要定义:

  1. 服务器将如何跟踪变化(在我的例子中,这是通过'created'字段来完成的)
  2. 客户端将如何请求这些变化
  3. 服务器将如何识别发生了哪些变化,以便通过API返回给客户端?

撰写回答