1

我有一个页面可以在特定页面上加载大量分析和数据,到目前为止它的加载还可以,但我想知道是否可以加快速度。我不得不尝试加快速度的想法是分别渲染每个部分。

例如,查看您在 SO 上的个人资料页面:它有问题、答案、声誉、标签、帐户、徽章、投票,在我当前的模型中,这些内容将被收集在模板中view.py,然后由模板呈现。但是,如果“声誉”或“标签”查询由于 XYZ 原因而变慢怎么办,即使它对大多数用户来说不是超级重要,它也会减慢整个页面的加载速度。我考虑过使用 JavaScript 发出请求并在页面上异步呈现 json 回复来解决这个问题,但我真的很喜欢 Pyramid 并使用 Python,所以如果可能的话,我想使用我已经知道的工具而不是学习 javascript 来做到这一点。这种方法的好处是我可以先加载/显示页面顶部,然后在查询完成时渲染页面的其余部分,或者按查询速度排序。

这可能吗,或者您对如何执行此操作有任何建议?

4

1 回答 1

2

这当然是可能的,但实现几乎完全与 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 解决方案更简洁、更简单、更灵活。

于 2012-07-19T21:32:20.863 回答