【问题标题】:django: guidelines for speeding up template rendering performancedjango:加速模板渲染性能的指南
【发布时间】:2012-01-24 01:24:42
【问题描述】:

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

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

我确实有很多 includes - 那里可能有问题吗?

【问题讨论】:

    标签: django performance django-templates


    【解决方案1】:

    我刚刚花了很多时间优化我的 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 用于删除包含。我在 for 循环中使用了 include。删除它们会大大加快渲染时间(快近 2 倍)
    • 在当前版本的 Django(撰写本文时为 1.10)中,当 DEBUG 为 False 时将自动启用 cached.Loader。
    • 您是否有更多关于如何解决无休止分页的信息(例如问题或原因)
    • Don't Use Fancy Templating Features 的 django 替代品是什么?我怀疑您打算 Client Side Rendering 与之前的建议相吻合。
    • TEMPLATE 中启用'django.template.loaders.cached.Loader' -> loaders 对我的情况有很大帮助。感谢您的优化提示。
    【解决方案2】:

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

    以下是向调试工具栏添加面板的方法。 http://django-debug-toolbar.readthedocs.org/en/latest/configuration.html#debug-toolbar-panels

    【讨论】:

    【解决方案3】:

    使用ManifestStaticFilesStorage 提供您的静态文件。相对于使用CachedStaticFilesStorage 和默认LocMemCache,我所见证的性能提升是巨大的。区别在于不需要在运行时计算哈希值。

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

    【讨论】:

      【解决方案4】:

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

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

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

      我不知道它是否只适用于我的情况,但似乎是。

      【讨论】:

      • 试一试,这是一个有趣的想法,但似乎对我没有任何帮助。
      【解决方案5】:

      如果您希望减少 localhost 中的加载时间,那么对于大多数使用 cached.Loader 的人来说,将显着缩短加载时间。

      注意:定义加载器时不能使用APP_DIRS: True

      默认情况下(当DEBUGTrue时),模板 每次渲染模板时,系统都会读取并编译您的模板。 虽然 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 答案中的一些其他选项已经提到了此选项。

      【讨论】:

        猜你喜欢
        • 2015-09-17
        • 1970-01-01
        • 2013-04-25
        • 2022-07-22
        • 2018-05-20
        • 2018-11-05
        • 2012-04-14
        • 2013-11-22
        • 2013-10-10
        相关资源
        最近更新 更多