我有一个加载大量分析的页面。特定页面上的数据,到目前为止它的加载还可以,但我想知道我是否可以加快速度。我必须尝试加快速度的想法是分别渲染每个部分。
例如,在SO上查看您的个人资料页面:它有问题,答案,信誉,标签,帐户,徽章,投票,在我当前的模型中将收集在view.py
中,然后由模板。但是,如果“信誉”或“标签”查询由于XYZ原因而缓慢,即使它对大多数用户来说不是非常重要,它也会减慢整个页面的负载。我想用JavaScript来解决这个问题,并在页面上异步呈现json回复,但我真的很喜欢Pyramid并使用Python,所以如果可能的话我想使用我已经知道的工具而不是学习javascript来做到这一点。这种方法的好处是我可以首先加载/显示页面的顶部,并在查询完成时呈现页面的其余部分,或者通过查询的速度来命令结束。
这可能,或者您对如何做到这一点有任何建议吗?
答案 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解决方案更简洁,更灵活。