如何在不重载页面的情况下更新Django页面?
我的Django应用程序从数据库中显示数据。这些数据会在没有用户干预的情况下发生变化,也就是说,这些变化是在后台进行的。每当数据发生变化时,我希望网页能够更新变化的部分,而不需要重新加载整个页面。
显然,AJAX是个不错的选择。当页面最初加载(或者之后手动完全重新加载)时,渲染的模板会加载一段JavaScript代码,这段代码会在页面加载完成后执行update("all"),然后这个update(...)会触发多个XMLHTTP请求,这些请求会返回数据,并将这些数据转换成对应部分的HTML内容。一切都运行得很好,尤其是在页面初次加载时。
现在,我在一个Python函数中,正在将一个新对象保存到数据库。
我该如何告诉浏览器去执行update(...)呢?
我是不是需要手动向一个URL发出请求,这个URL对应一个视图,然后这个视图再渲染一个包含执行update(...)的JavaScript代码的模板呢?天哪!
我感觉自己没有遵循通常的方法。也许我只是离问题太近了。
有人能帮帮我吗?
3 个回答
你还可以使用Websocket API,链接在这里:https://developer.mozilla.org/en-US/docs/Web/API/WebSockets_API。通过这个API,你可以向服务器发送消息,并且可以在不需要不断询问服务器的情况下,接收到服务器的实时回复。
2021年更新:使用channels: https://channels.readthedocs.io/en/latest/
你有两个选择:
- 让浏览器定时请求数据,使用setTimeout()这个方法。
- 了解一下Comet技术——这是一种从服务器向浏览器推送数据的方法。
这里有一篇关于Django中的Comet的文章。
有两种方法:
直接更新数据库,然后等到下一个AJAX查询。这意味着你需要定期进行查询,你需要在更新的及时性和服务器负担之间找到一个平衡。如果能做一个简单的查询来确认是否有更新,那会稍微好一点。也许可以让这个检查只依赖于memcached,而不是直接去数据库。
使用Comet技术。简单来说,就是客户端发出一个AJAX查询来请求更新。服务器看到没有更新,所以不立即回复。相反,它会保持连接长时间开放。最终,要么更新来了,服务器才会回复,要么客户端超时了,连接被关闭。在这种情况下,客户端应该立刻重新发出查询,继续等待更新。