这当然是可能的,但实现几乎完全与 Pyramid 或 Jinja2 无关。Pyramid(或任何其他 Web 框架)的工作方式是它从客户端获取一些文本(抽象为请求对象)并基本上返回另一个文本块作为响应,因此操作或多或少是原子的 -在模板引擎完成生成页面的全文之前,不会将响应发送回客户端。
实际上,有一种方法可以让 Pyramid 一点一点地向客户端发送数据,这将使浏览器逐步渲染页面(就像在拨号连接时返回一样) - 就像直接写入文件一样代表响应正文的对象:
import time
def some_view(request):
for i in range(1, 31):
request.response.body_file.write(".")
time.sleep(1)
但是这种方法有点受限,因为您只能将数据附加到您已经发送的内容中,无法显示“请稍候,图表正在加载”消息并将其替换为真实图表,甚至首先加载页眉和页脚,然后在中间插入一些东西。此外,这种方法需要您手动渲染模板或根本不使用模板。我只将它用于一些长时间运行的批处理操作
正如您在问题中提到的,更好的技术涉及使用 JavaScript 从单独的 URL 加载页面的位。我相信异步加载的块通常被称为“部分”。
您注册了一些单独的视图,它们代表您的主页和您要插入的位,因此,例如,/questions/123454
将加载页面的主要部分,/questions/123454/badges
将加载带有徽章的块并/questions/123454/related
加载相关问题的列表
您在将插入部分的页面中定义占位符:
< div id="badges-partial" >加载中...</div >
您在页面中添加了一点 javascript 来加载部分内容(好吧,如果您使用jquery会很小:):
$(function () {
$("#badges-partial").load("/questions/123454/badges");
$("#related-partial").load("/questions/123454/related");
});
因此,如您所见,JavaScript 解决方案更简洁、更简单、更灵活。