Django缓存 - 如何设置代码以避免重复缓存逻辑?

时间:2012-04-04 14:23:02

标签: django caching

我开始分析我的应用程序并发现有一段代码需要比其他代码花费更长的时间才能完成。在视图中,我正在从数据库中检索一些数据并对其进行一些转换。在模板中,有一个过滤器,它将获取此转换后的数据并转换为HTML。

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

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

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

2 个答案:

答案 0 :(得分:1)

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

  • 在缓存块内的模板标记中执行逻辑
  • 包装逻辑并将其传递给渲染,通常采用闭包或模型方法
  • 的形式
  • 只做渲染缓存,只要渲染过程很简单
  • 在TemplateResponse的帮助下检查SSI的可能性
  • 在视图中编写代码以检查和使用模板缓存,并考虑可能的种族写和狗堆问题。

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

答案 1 :(得分:0)

您无需在视图中缓存并在模板片段中缓存。缓存的想法是,一旦你有缓存的东西,你从缓存中获取它,直到缓存密钥到期。

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

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

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