2012-04-04 59 views
4

我开始分析我的应用程序,发现有一段代码需要比其他代码更长的时间才能完成。在视图中,我从数据库中检索一些数据并稍微转换它。在模板中,有一个过滤器会将这些转换后的数据转换为HTML。Django缓存 - 如何设置我的代码以避免重复缓存逻辑?

我意识到我可以利用缓存,因为这个组件不会频繁更改,但我想知道最好的方法是什么。我可以缓存数据库调用/转换的结果,但我也可以缓存模板片段。看起来很奇怪,我需要缓存两件事才能获得最佳效果,所以我想我的代码应该有不同的结构,所以我只需要将数据缓存在一个位置。

我的一个想法是从模板过滤器函数中进行数据库调用,但我一直试图将我的模型代码保存在我的模板过滤器之外。

处理这类问题的最佳方法是什么?

回答

0

您不需要在视图和模板片段中缓存。缓存的想法是,一旦你缓存了某些东西,就可以从缓存中获取它,直到缓存密钥过期。

在视图中缓存数据库结果意味着编写一些特定于视图逻辑的代码,每次逻辑更改时可能需要更改。

缓存模板片段是一种更好的方法,因为即使您更改模板“逻辑”,只要将片段保留在缓存块中,缓存将继续工作。

另外恕我直言,越接近你缓存的最终响应,缓存逻辑将越可靠。

+1

是的 - 我明白这一点,这就是为什么我想尽量减少它。不幸的是,如果我只缓存模板片段,那么视图仍然会调用数据库来检索数据,因为那时它不知道将使用它的模板片段已被缓存。我如何构建项目来处理这个问题? – 2012-04-04 16:22:23

+0

如果要在一个位置处理缓存,可以使用django缓存中间件来缓存请求,并假定需要更频繁地缓存片段,对通用缓存和模板片段使用不同的超时。 – ygneo 2012-06-06 22:55:26

+0

是的 - 我最终重构了代码以使模板片段从缓存中检索或在视图中进行计算,因此全部在一个位置完成。 – 2012-06-07 13:53:02

1

如果可以将转换表示为复杂的查询集,则可以在模板中对其进行评估,而无需在模板中进行缓存。如果没有,你可以

  • 做逻辑模板标签缓存块中
  • 包装逻辑,并通过它来呈现,通常在关闭或模型方法的形式
  • 只做视图缓存,只要因为渲染过程很简单
  • 检查SSI的可能性w /有关TemplateResponse的帮助
  • 编写代码来检查并使用模板缓存,考虑到可能的竞赛写作和狗桩问题。

此外,对于查询集缓存,您可以尝试johnny-cache以及django-cache-machine

+0

不幸的是,转换有点复杂,目前需要在代码中完成 - 这也是在Django的ORM之外进行的,因为我正在使用MongoDB。一种方法是让该方法生成html代码,然后将其传递到模板中。这似乎有点粗略,但我也不想从模板标签中进行Mongo调用。不幸的是,这些对我来说都不是特别优雅,但我想我会在模板标签中完成逻辑。 – 2012-04-04 20:41:19

+0

您是否介意粘贴一些代码,以便我们看到如何从视图中使用MongoDB?将逻辑移动到模板标签通常不是一个好主意。 – ygneo 2012-04-05 10:38:40

+0

在Django中,视图是控制器。我只是进行map-reduce调用并缓存每个用户的结果。 – 2012-06-07 13:51:52