我可以使用金字塔分别渲染Jinja2模板的不同部分吗?

时间:2012-07-18 19:34:07

标签: python pyramid jinja2

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

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

这可能,或者您对如何做到这一点有任何建议吗?

1 个答案:

答案 0 :(得分:2)

这肯定是可能的,但实现几乎完全与Pyramid或Jinja2无关。 Pyramid(或任何其他Web框架)的工作方式是它从客户端获取一些文本(被抽象到请求对象中)并基本上返回另一个文本blob响应,因此操作或多或少是原子的 - 在模板引擎完成生成页面的全文之前,响应不会发送回客户端。

实际上,有一种方法可以让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”> Loading ...< / div>

  • 您在页面中添加了一小部分javascript以加载部分内容(如果您使用jquery :),它会很小:

    $(function () {
        $("#badges-partial").load("/questions/123454/badges");
        $("#related-partial").load("/questions/123454/related");
    });
    

所以,正如您所看到的,JavaScript解决方案更简洁,更灵活。