django - 如何在 Django 中为所有用户缓存视图
问题描述
我正在尝试将 AWS ElastiCache 的 Memcached 实例与 Django 项目一起使用。它似乎正在为用户缓存视图,但如果您在不同的 PC 上进入,它不会被缓存,直到从该 PC(或具有不同浏览器的同一 PC)调用。
我不确定我做错了什么。
在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',
]
然后我使用缓存了视图cache_page
path('<str:service_type>/<str:location>/', cache_page(60*60)(views.canonical_search), name="canonical-search"),
如何缓存站点,以便无论用户如何都缓存页面?
编辑 我注意到在使用用户登录时它永远不会缓存。
解决方案
注意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
推荐阅读
- angular - 使用下拉菜单过滤角材料表
- events - 如何使用 Yii2 实现实时通知系统?
- javascript - 角度 ui-router 子状态动态
- javascript - 在 NodeJS 中从 html 调用 TypeScript 编译的代码
- visual-studio-code - vscode 在哪里存储文件关联覆盖?
- python - 具有多重继承和 pytest 的 Super 产生 TypeError
- c# - 为什么 Visual Studio 不显示我的 WinForm 项目构建?
- bash - 如何在 bash 中并排打印多个 .csv 文件并找出这 3 个文件之间的区别
- javascript - 为 NodeJS 单元测试运行内存中的沙盒 Neo4J 数据库
- r - 如果条件 --- 需要 TRUE/FALSE 的缺失值