如何在 Django 中缓存所有用户的视图

Hen*_*ryM 5 django

我正在尝试将 AWS ElastiCache 的 Memcached 实例与 Django 项目结合使用。它似乎正在为用户缓存视图,但如果您使用不同的电脑,则在从该电脑(或具有不同浏览器的同一台电脑)调用之前,它不会被缓存。

我不确定我做错了什么。

我里面settings.py

CACHES = {
    'default': {
        'BACKEND': 'django.core.cache.backends.memcached.MemcachedCache',
        'LOCATION': os.environ.get('CACHE_LOCATION','127.0.0.1:11211'),
    }
}

MIDDLEWARE = [
    'core.middleware.DenyIndexMiddleware',
    'core.middleware.XForwardedForMiddleware',
    'core.middleware.PrimaryHostRedirectMiddleware',
    'django.middleware.security.SecurityMiddleware',
    'django.contrib.sessions.middleware.SessionMiddleware',
    'django.middleware.cache.UpdateCacheMiddleware',
    'django.middleware.common.CommonMiddleware',
    'django.middleware.csrf.CsrfViewMiddleware',
    'django.contrib.auth.middleware.AuthenticationMiddleware',
    'django.contrib.messages.middleware.MessageMiddleware',
    'django.middleware.clickjacking.XFrameOptionsMiddleware',
    'django.contrib.redirects.middleware.RedirectFallbackMiddleware',
    'masquerade.middleware.MasqueradeMiddleware',
    'django.middleware.locale.LocaleMiddleware',
    'django.contrib.sites.middleware.CurrentSiteMiddleware',
    'cms.middleware.user.CurrentUserMiddleware',
    'cms.middleware.page.CurrentPageMiddleware',
    'cms.middleware.toolbar.ToolbarMiddleware',
    'cms.middleware.language.LanguageCookieMiddleware',
    'cms.middleware.utils.ApphookReloadMiddleware',
    'django.middleware.cache.FetchFromCacheMiddleware',
]
Run Code Online (Sandbox Code Playgroud)

然后我使用缓存了视图cache_page

path('<str:service_type>/<str:location>/', cache_page(60*60)(views.canonical_search), name="canonical-search"),
Run Code Online (Sandbox Code Playgroud)

如何缓存站点以便无论用户如何都缓存页面?

编辑 我注意到它在使用用户登录时从不缓存。

Seb*_*bin 5

请注意Vary标题,它cache_page()会被考虑在内。

通常,一些中间件可能会添加Vary标头,例如:

  • CsrfViewMiddleware补充道Cookie
  • GZipMiddleware添加Accept-Encoding
  • LanguageCookieMiddleware可以添加Accept-Language

这意味着,一旦您拥有不同的 Cookie(会话)、编码或语言,您的页面就会拥有不同版本的缓存。

至于您的情况,CsrfViewMiddleware可能是问题所在,您可以将装饰器添加@csrf_exempt到视图中,以便Vary: Cookie在响应中不会设置标头。

更多信息请访问https://docs.djangoproject.com/en/3.0/topics/cache/#using-vary-headers