【问题标题】:how to update a Django page without a page reload?如何在不重新加载页面的情况下更新 Django 页面?
【发布时间】:2010-12-22 15:39:59
【问题描述】:

我的 Django 应用程序显示来自数据库的数据。这些数据在没有用户干预的情况下发生变化,即在幕后。每当它发生变化时,我希望网页在不重新加载整个页面的情况下更新更改的部分。

显然,AJAX 浮现在脑海中。当页面最初加载(或手动,稍后完全重新加载)时,呈现的模板会加载一个运行 window.onload = update("all"), update(...) 的 JavaScript 依次触发许多 XMLHTTPRequest它再次返回数据,这些数据被转换为相应部分的 HTML 片段。一切正常。在初始页面加载时。

现在我发现自己处于一个 Python 函数中,该函数将一个新对象保存到数据库中。

如何告诉浏览器运行 update(...) ?

我是否需要以某种方式手动向映射到视图的 url 发出请求,该视图又呈现包含 JavaScript 代码的模板以运行 update(...) ???天哪!

我觉得我没有遵循通常的方法。 也许我只是站在问题面前。

谁能帮帮我?

【问题讨论】:

    标签: javascript python ajax django


    【解决方案1】:

    2021 年更新:使用频道:https://channels.readthedocs.io/en/latest/

    你有两个选择

    1. 使用 setTimeout() 让浏览器轮询
    2. 看看 Comet——这是一种将数据从服务器推送到浏览器的技术。

    这是一篇关于Comet in Django的文章

    【讨论】:

    【解决方案2】:

    两种方法:

    1. 只需更新数据库并等待下一个 AJAX 查询。这意味着它应该定期进行查询,您必须在即时性和服务器负载之间取得平衡。如果您可以进行廉价查询以验证是否有更新,这会有所帮助。也许让检查只依赖于 memcached 而不是去数据库

    2. 使用comet。简而言之:客户端执行 AJAX 查询请求更新。服务器看到没有更新,所以它没有回答。相反,连接会长时间保持打开状态。最终要么更新到来,服务器最终回答,要么客户端超时并终止连接。在这种情况下,客户端应立即重新发出查询以继续等待更新。

    【讨论】:

    • 感谢两位的帮助! :-) 我会研究彗星,看看我能不能让它工作,否则我将不得不定期轮询以获取更新。
    • 两个答案都非常好,只是将任意一个设置为接受的答案。再次感谢! :-)
    【解决方案3】:

    您也可以使用 Websocket API https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API。使用此 API,您可以向服务器发送消息并接收事件驱动的响应,而无需轮询服务器以获取回复。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-04-20
      • 2021-07-17
      • 1970-01-01
      • 1970-01-01
      • 2014-04-12
      • 2017-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多