【发布时间】:2012-01-24 01:24:42
【问题描述】:
如何加快 Django 模板的渲染速度?在视图函数完全计算出它需要的任何内容之后,我的模板大约需要 1-2 秒来渲染。
我已经尝试在视图中执行所有数据库访问,这样模板只会访问 RAM 而不会访问数据库引擎。
我确实有很多 includes - 那里可能有问题吗?
【问题讨论】:
标签: django performance django-templates
如何加快 Django 模板的渲染速度?在视图函数完全计算出它需要的任何内容之后,我的模板大约需要 1-2 秒来渲染。
我已经尝试在视图中执行所有数据库访问,这样模板只会访问 RAM 而不会访问数据库引擎。
我确实有很多 includes - 那里可能有问题吗?
【问题讨论】:
标签: django performance django-templates
我刚刚花了很多时间优化我的 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 插件会极大地降低速度。那是因为它必须为每个页码加载一个新模板。我进入并破解了它,直到我让它做我想做的事情,但在你这样做之前,请尝试删除它,看看你会得到什么类型的性能改进。执行上述操作将我在 GAE 实例上的复杂页面的渲染时间从大约 1.0S 减少到 250ms,但同样,您的里程可能会有所不同。
【讨论】:
TEMPLATE 中启用'django.template.loaders.cached.Loader' -> loaders 对我的情况有很大帮助。感谢您的优化提示。
我建议在步骤 0 中向 Django 调试工具栏添加一个名为 Django Toolbar Template Timings 的额外面板。它准确地告诉我在每个模板(块等)中花费了多少时间,以及其中有多少时间在 SQL 中。这也是您的问题的额外验证。
以下是向调试工具栏添加面板的方法。 http://django-debug-toolbar.readthedocs.org/en/latest/configuration.html#debug-toolbar-panels
【讨论】:
使用ManifestStaticFilesStorage 提供您的静态文件。相对于使用CachedStaticFilesStorage 和默认LocMemCache,我所见证的性能提升是巨大的。区别在于不需要在运行时计算哈希值。
我不太清楚为什么差异如此之大 - 虽然 CachedStaticFilesStorage 确实最初需要计算哈希并填充缓存,但一旦缓存被填充,我不会期望相对于清单方法有显着的性能损失。但它很大,文档还建议使用ManifestStaticFilesStorage 来提高性能。
【讨论】:
我发现的另一个技巧:我必须显示一个 755 行 * 15 列的 HTML 表格(总共填充 11,325 个数据)。
该页面过去加载延迟大约 25/30 秒,然后页面有点滞后。我所做的是使用display:none 设置表格,并在页面完全加载后,使用 JavaScript 更改 CSS 属性。
完成所有这些之后,页面加载时间最长为 6 秒。我想 Django 渲染不可见元素的时间要少得多。
我不知道它是否只适用于我的情况,但似乎是。
【讨论】:
如果您希望减少 localhost 中的加载时间,那么对于大多数使用 cached.Loader 的人来说,将显着缩短加载时间。
注意:定义加载器时不能使用APP_DIRS: True。
默认情况下(当
DEBUG为True时),模板 每次渲染模板时,系统都会读取并编译您的模板。 虽然 Django 模板系统非常快,但从 阅读和编译模板可以加起来。您使用其他加载器列表配置缓存的模板加载器 它应该换行。包装好的装载机用于定位未知 首次遇到模板时。然后缓存的加载器 将编译后的模板存储在内存中。缓存的模板实例 为后续加载相同模板的请求返回。
如果没有
OPTIONS['loaders'],这个加载器会自动启用 指定且OPTIONS['debug']为False(后一个选项默认为DEBUG的值)。
将此添加到您的TEMPLATES['OPTIONS']。
"loaders": [
(
"django.template.loaders.cached.Loader",
[
"django.template.loaders.filesystem.Loader",
"django.template.loaders.app_directories.Loader",
],
),
],
现在您的TEMPLATES 设置将如下所示。
TEMPLATES = [{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [BASE_DIR / 'templates'],
'APP_DIRS': False,
...
'OPTIONS': {
'context_processors': [...]
'loaders': [
('django.template.loaders.cached.Loader', [
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
'path.to.custom.Loader',
]),
],
},
}]
顺便说一句,speedplane 答案中的一些其他选项已经提到了此选项。
【讨论】: