我正在尝试使用Django CMS设置Django的每站点缓存(https://docs.djangoproject.com/en/1.10/topics/cache/#the-per-site-cache),但我无法使缓存适用于CMS页面,但它适用于apphooked页面。
这是我设置的一小部分:
MIDDLEWARE_CLASSES = [
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.gzip.GZipMiddleware',
'htmlmin.middleware.HtmlMinifyMiddleware',
'htmlmin.middleware.MarkRequestMiddleware',
'cms.middleware.utils.ApphookReloadMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
'django.contrib.redirects.middleware.RedirectFallbackMiddleware',
'cms.middleware.user.CurrentUserMiddleware',
'cms.middleware.page.CurrentPageMiddleware',
'cms.middleware.toolbar.ToolbarMiddleware',
'cms.middleware.language.LanguageCookieMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
]
CACHE_MIDDLEWARE_ALIAS = 'default'
CACHE_MIDDLEWARE_SECONDS = 60
CACHE_MIDDLEWARE_KEY_PREFIX = 'mysite-'
CMS_PAGE_CACHE = True
CACHES = {
'default': {
'BACKEND': 'django.core.cache.backends.db.DatabaseCache',
'LOCATION': 'cache_table',
'TIMEOUT' : 60*60*24,
'OPTIONS': {
'MAX_ENTRIES': 10000,
}
}
}
如果我导航到apphooked页面,响应标题为:
Cache-Control: max-age=60
哪个是对的。但是对于CMS页面,我得到标题:
Cache-Control: max-age=0, no-store, no-cache, must-revalidate
哪个不对。
Django CMS文档(http://docs.django-cms.org/en/release-3.4.x/how_to/caching.html)说UpdateCacheMiddleware应该是最后一个FetchFromCacheMiddleware,这就是我所做的并且没有运气。
我重新启动了服务器,尝试更新页面上的内容并重新发布,但仍然没有运气。
我在这里缺少什么?!
非常感谢任何帮助。
答案 0 :(得分:3)
经过几个小时的痛苦和折磨,我终于找到了解决这个问题的方法。问题是由于我有一些我设置为不缓存的自定义插件,例如:
from cms.plugin_base import CMSPluginBase
from cms.plugin_pool import plugin_pool
class MyPlugin(CMSPluginBase):
name = 'My plugin'
cache = False
...
plugin_pool.register_plugin(MyPlugin)
在插件设置为不缓存的页面上,缓存控制标头显示为:
Cache-Control: max-age=0, no-store, no-cache, must-revalidate
我认为这是正确的。如果从该页面中删除插件,则会获得预期的标题:
Cache-Control: max-age=60
希望有一天能帮助其他人。