如何通过 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