如何在需要时自动更新Django页面?
在这个链接中提到的内容是关于如何在Django中更新网页而不重新加载页面。我通过JavaScript定期向服务器发送XMLHTTP请求,以获取在我的应用程序运行过程中会变化的网页部分。
不过,大多数时候,实际上并没有什么变化;服务器返回的内容和之前一样,浏览器更新的网页内容也是之前已经有的。
显然,服务器应该只在有新数据时才回复。
我在网上查找了一些资料,发现了一个链接,但里面的说明很简略,我在我的Django项目中实现这个概念时遇到了困难。我很难相信这个问题之前没有人解决过。
有没有人知道其他可以作为参考的资源?
1 个回答
9
回答这个问题的难点在于不知道服务器端返回给用户的资源是什么。
我来举个例子。假设你正在开发一个应用,可以实时监控用户在你网站上发表的评论。为了实现这个功能,我们可以做几件事情:
- 服务器记录评论添加的时间(.created字段)
- 获取最新评论的接口需要我们指定想要多旧的评论
- 视图查询并返回自那时以来添加的评论
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,具体实现会根据服务器返回的内容而有所不同。
从你的问题来看,你希望服务器来管理识别哪些是最近更新的,而不是客户端(这是个不错的策略)。在这种情况下,你需要定义:
- 服务器将如何跟踪变化(在我的例子中,这是通过'created'字段来完成的)
- 客户端将如何请求这些变化
- 服务器将如何识别发生了哪些变化,以便通过API返回给客户端?