如何通过 Django 默认将 "public" 添加到缓存视图?
How to add "public" by default to cached views by Django?
我正在尝试使用 Google Cloud CDN 来缓存 Django 响应。 Django 正确设置 cache-control header 最大年龄,但它缺少 header.
的 'public' 部分
基本上,目前所有的缓存视图都有:
cache-control: max-age=3600
但我想要:
cache-control: max-age=3600,public
编辑:
我当前的 settings.py 有以下缓存:
MIDDLEWARE = [
...
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
...
]
....
CACHE_MIDDLEWARE_ALIAS = 'default'
CACHE_MIDDLEWARE_SECONDS = 3600
CACHE_MIDDLEWARE_KEY_PREFIX = ''
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": os.environ.get('CACHE_URL'),
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"IGNORE_EXCEPTIONS": True,
"MAX_ENTRIES": 10000,
}
}
}
所以我基本跟着https://docs.djangoproject.com/en/3.1/topics/cache/。所以我缓存了整个网站。对于那些我不想缓存的视图,我使用 @never_cache
.
编辑 2:
我可以在每个带有注释的视图中添加“public=True”,但我想要一个针对整个站点的解决方案。
现在我只想要一个简单的中间件。虽然我愿意接受建议。
class PublicCacheMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
if response.has_header('Cache-Control') and 'private' not in response.get('Cache-Control'):
response['Cache-Control'] += ',public'
return response
我正在尝试使用 Google Cloud CDN 来缓存 Django 响应。 Django 正确设置 cache-control header 最大年龄,但它缺少 header.
的 'public' 部分基本上,目前所有的缓存视图都有:
cache-control: max-age=3600
但我想要:
cache-control: max-age=3600,public
编辑: 我当前的 settings.py 有以下缓存:
MIDDLEWARE = [
...
'django.middleware.cache.UpdateCacheMiddleware',
'django.middleware.common.CommonMiddleware',
'django.middleware.cache.FetchFromCacheMiddleware',
...
]
....
CACHE_MIDDLEWARE_ALIAS = 'default'
CACHE_MIDDLEWARE_SECONDS = 3600
CACHE_MIDDLEWARE_KEY_PREFIX = ''
CACHES = {
"default": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": os.environ.get('CACHE_URL'),
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
"IGNORE_EXCEPTIONS": True,
"MAX_ENTRIES": 10000,
}
}
}
所以我基本跟着https://docs.djangoproject.com/en/3.1/topics/cache/。所以我缓存了整个网站。对于那些我不想缓存的视图,我使用 @never_cache
.
编辑 2: 我可以在每个带有注释的视图中添加“public=True”,但我想要一个针对整个站点的解决方案。
现在我只想要一个简单的中间件。虽然我愿意接受建议。
class PublicCacheMiddleware:
def __init__(self, get_response):
self.get_response = get_response
def __call__(self, request):
response = self.get_response(request)
if response.has_header('Cache-Control') and 'private' not in response.get('Cache-Control'):
response['Cache-Control'] += ',public'
return response