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

ssc*_*ssc 2 javascript python django ajax

正如在描述如何在不重新加载页面更新Django的页面?,我使用JavaScript从浏览器定期向服务器发送XMLHTTPRequests,以获取在我的应用程序过程中发生变化的那些网页.

但是,大多数时候,没有任何变化; 服务器回复相同的响应,浏览器使用已经存在的内容更新网页.

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

http://ajaxpatterns.org/Periodic_Refresh#Lace进行了彻底的网络研究,但是dcoumentation很简洁,我正在努力在我的Django项目中实现这个概念.我很难相信以前没有这样做过.

有谁知道我可以用作指导的任何进一步的资源?

T. *_*one 9

回答的难点在于不知道返回给用户的服务器端资源是什么.

我会编造一些可以作为例子的东西.假设您正在开发一个应用程序,允许您监视您网站上的用户所做的实时评论.我们可以做几件事来实现这个目标:

  1. 服务器跟踪添加注释的时间(.created字段)
  2. 获取最新评论的API要求我们指定我们想要的评论年龄
  3. 视图仅查询并返回自那时以来添加的视图

models.py

class Comment(models.Model):
    text = models.TextField()
    created = models.DateTimeField(default=datetime.now())
Run Code Online (Sandbox Code Playgroud)

urls.py

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

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')
Run Code Online (Sandbox Code Playgroud)

在客户端,您获取JSON,检查它是否具有值,如果是这样,则枚举项目,并将新项目添加到您的<div>标记或其他任何内容.


正如您所看到的,API的开发仅返回最近更新的项目将根据服务器返回的内容而有所不同.

从您的问题来看,听起来您希望服务器管理识别最近更新的内容,而不是客户端(这是一个好策略).在这种情况下,您需要做的是定义:

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

  • 非常感谢您抽出宝贵时间并提供如此详尽的答案!我认为我的问题是我最了解这些碎片,但看不出它们是如何结合在一起的.我的应用程序现在大部分都在工作,只是一些细节(我可能会在另一个问题上请求帮助;-)再次感谢!很好! (2认同)