【问题标题】:Post-process a rendered django template对渲染的 django 模板进行后处理
【发布时间】:2015-11-14 18:51:21
【问题描述】:

假设我有一个为 django 编写的基本自定义模板标签。在我的模板中,假设我这样使用它:

{% do_something "x" %}
{% do_something "y" %}
{% do_something "z" %}

do_something 需要从模型(即数据库)中获取信息,这些信息由标签呈现。我是否正确假设每次我在模板中添加对 do_something 的调用时,django 都会调用我的数据库?

如果是这样,我想找到一个替代解决方案,我能想到的唯一解决方案是:

编写一个“响应后处理器”中间件,该中间件将解析呈现的响应以查找某种占位符,例如 __x____y__ 等,整理它们,执行单个分组查询,然后将占位符替换为相关内容。

这对我来说似乎相当“hacky”,只是感觉不对。这是我唯一的选择吗?

【问题讨论】:

  • 我不知道 do_something 是做什么的,但是按照它的编写方式,你能做一些像{% do_something "x", "y", "z" %} 这样的事情吗? do_something 会为所有 3 渲染所有东西?那样的话,如果你在 template_tag 中做你的逻辑,你只会访问一次数据库。

标签: django django-templates django-template-filters


【解决方案1】:

首先:请不要做你提出的hack,它看起来很容易出错并且很臭。

无论如何,答案很大程度上取决于do_something 的实际作用。如果它以某种方式访问​​您存储模型 instance 的模板上下文,那么不,如果模型已经从服务器获取,Django 不会多次访问数据库 - 来自 db 的数据存储在 @ 987654323@.

但是,如果do_something 逻辑不适用于模板上下文,而是有自己的逻辑而不是 yes - 它将被调用多次。您可以使用像https://pythonhosted.org/django-memoize/ 这样的缓存工具,但在您的情况下,只有当您使用相同的参数调用函数时,缓存才适用于该用户案例。事实并非如此——你用 x,y,z 来调用它...

如果 x,y,z 调用的数据库逻辑相同,您可以创建访问数据库的缓存函数,而不是从模板标签中调用此函数。

【讨论】:

    【解决方案2】:

    您也可以以某种方式缓存模板标签在第一次调用时使用的对象,以便下一次调用可以重用它们。模板标签正在获取上下文变量,您可以在此处添加您的“缓存”对象作为变量。

    【讨论】:

      猜你喜欢
      • 2014-01-17
      • 2022-09-27
      • 2010-11-29
      • 2022-07-22
      • 2011-11-29
      • 1970-01-01
      • 2018-05-20
      • 2018-11-05
      • 2021-11-25
      相关资源
      最近更新 更多