Django缓存之间有什么区别?网站缓存、视图缓存、指定视图缓存和模板片段缓存。

0 投票
1 回答
984 浏览
提问于 2025-04-16 12:07

我知道Django有一些缓存的方法,比如每个网站的缓存、每个视图的缓存、指定每个视图的缓存和模板片段缓存。 但是这些缓存之间有什么区别呢? 每个网站的缓存是指缓存整个网站吗? 我该怎么理解“缓存整个网站”这句话呢?

1 个回答

7

我觉得文档对这个内容的描述很到位,但我还是把它粘贴在这里,并稍微解释一下。

“缓存整个网站”意味着Django会尝试通过中间件缓存你设置的每一个视图。

整个网站缓存文档
http://docs.djangoproject.com/en/dev/topics/cache/#the-per-site-cache

一旦缓存设置好,使用缓存的最简单方法就是缓存你整个网站。

简单来说,这是一组中间件,它会缓存所有的视图。中间件会应用到每一个请求和响应上。


按视图缓存文档
http://docs.djangoproject.com/en/dev/topics/cache/#the-per-view-cache

使用缓存框架的另一种更细致的方法是缓存单独视图的输出。django.views.decorators.cache定义了一个cache_page装饰器,可以自动为你缓存视图的响应。

这是按视图缓存。你可以通过在特定视图上应用@cache_page装饰器来决定是否缓存某个视图(而不是上面提到的所有视图)。


模板片段缓存文档
http://docs.djangoproject.com/en/dev/topics/cache/#template-fragment-caching

{% cache %}模板标签会缓存某个块的内容,持续一段时间。

这让你可以缓存模板中的某些部分(而不是整个视图),例如你可以在模板中缓存一个耗时的查询,而其他部分仍然可以动态加载。

这在某些部分不能被缓存的情况下非常有用,比如显示登录用户的经典问题。如果使用按视图缓存,就无法做到这一点,因为用户信息需要更新,从而导致缓存失效。


如果你继续阅读文档,你会找到缓存API的内容:

缓存API文档
http://docs.djangoproject.com/en/dev/topics/cache/#the-low-level-cache-api

这基本上是你如何在Python代码中控制缓存的方法(而不是上面的模板)。

# imagine you have a function that takes a day to complete.
cache.set('very_expensive_homepage_logic', takes_a_day_to_calculate())

# now if you call get() with your key, it will be returned and you won't have to wait a day to calculate.
cache.get('very_expensive_homepage_logic')

撰写回答