django:加速模板渲染性能的指南

时间:2011-12-20 00:26:40

标签: django performance django-templates

我如何加速Django模板渲染?在视图函数完全计算它需要的任何内容之后,我的模板需要大约1-2秒左右才能渲染。

我已经尝试在视图中执行所有数据库访问,这样模板只能访问RAM而不是数据库引擎。

我确实有很多include s - 那里有问题吗?

4 个答案:

答案 0 :(得分:18)

我花了很多时间来优化我的django模板代码。以下是适用于我的优化指南,但根据您的设置,您可能无法获得加速。

  • 提供模板引擎unicode,而非str :Django将所有变量强制转换为unicode。这不需要太长时间,但如果模板中的许多地方使用str变量,则可能会导致明显的延迟。这很容易修复,只要您将文本数据发送到Django渲染器,请确保它是unicode。
  • 将变量标记为safe :Django的自动安全措施非常好,但它们确实带来了很小的性能影响。如果您在模板中使用了很多变量,并且知道它是安全的,那么请务必将其标记为此类。
  • 缓存编译模板:当您调用render_template_from_string时,django会拉取模板,编译它,然后渲染它。 Django可以很容易地缓存这个过程的前两部分并将它们存储在内存中。您只需在settings.py文件中进行一次小的更改即可将cached.Loader添加到TEMPLATE_LOADERS。更多内容解释为in the Django documentation
  • 修复或不使用endless pagination :我发现endless pagination插件极其缓慢。这是因为它必须为每个页码加载一个新模板。我进去攻击它直到我按照我想要的方式进行操作,但在你这样做之前,尝试删除它,看看你得到了什么类型的性能改进。
  • 不要使用花式模板功能:继承,嵌套块,for循环和包含很好,但它们会带来性能成本。使用它们时要非常小心,尽量不要进行多级继承。使用客户端渲染可以更好地处理for循环。
  • 客户端渲染:加速服务器端渲染的一个简单技巧就是在客户端上执行此操作。一种策略是在django模板中嵌入json结构,然后使用javascript构建HTML。这显然违背了django服务器端渲染的目的,但它会导致加速。如果您必须在首屏下方呈现内容(即,用户不需要在页面加载时立即看到它),这将特别有用。

执行上述操作会将GAE实例上复杂页面的渲染时间从大约1.0S缩短到250ms,但同样,您的里程可能会有所不同。

答案 1 :(得分:8)

我建议在步骤0中向Django Debug Toolbar添加一个名为Django Toolbar Template Timings的额外面板。它告诉我在每个模板(块等)中花费了多少时间,以及SQL中有多少时间。这也是你的问题的额外验证。

enter image description here

以下是如何将面板添加到调试工具栏。 http://django-debug-toolbar.readthedocs.org/en/latest/configuration.html#debug-toolbar-panels

答案 2 :(得分:1)

我发现的另一个技巧:我必须显示一个755行* 15列的HTML表(总共填充11,325个数据)。

该页面过去通常会延迟大约25/30秒的加载时间,然后页面有点滞后。我所做的是使用display:none设置表,并在页面完全加载后,使用JavaScript更改了CSS属性。

所有这些之后,页面最多加载6秒钟。我想Django花在渲染不可见元素上的时间要少得多。

我不知道它是否仅适用于我自己的情况,但似乎可行。

答案 3 :(得分:0)

使用ManifestStaticFilesStorage来提供静态文件。我见证的相对于使用默认LocMemCache的{​​{3}}而言,性能提升是巨大的。差别是没有哈希需要在运行时计算。

我不太清楚为什么为什么差异如此巨大 - 而CachedStaticFilesStorage最初需要计算哈希值并填充缓存,一旦缓存为我不希望相对于清单方法有显着的性能损失。但它 大量,文档还建议使用ManifestStaticFilesStorage来提高性能。