Django 3.0.2 get_cache_key возвращает разные ключи кэша

Я пытаюсь аннулировать представление, следуя этому Expire a view-cache in Django? .

Вот функция представления, в которой я отключил per-site кэширование и включил per-view кэширование.

Это представление, скажем, которое мне нужно инвалидировать.

@api_view(["GET"])
@never_cache
@cache_page(60*60)
def get_segment_list(request, appid: str, page: str) -> JsonResponse:
    try:
    ...

Я уже вызывал get_segment_list один раз, и это привело к кэшированию заголовка ответа и страницы.

127.0.0.1:6379> keys *
1) ":1:views.decorators.cache.cache_page..GET.39679326f007515994e08d99042c26f7.d41d8cd98f00b204e9800998ecf8427e.en-us.UTC"
2) ":1:views.decorators.cache.cache_header..39679326f007515994e08d99042c26f7.en-us.UTC". <<-- NOTE THIS

Вот expire-view функция.

def expire_view_cache(view_name, args=[], namespace=None, key_prefix=None):
    """
    This function allows you to invalidate any view-level cache.
        view_name: view function you wish to invalidate or it's named url pattern
        args: any arguments passed to the view function
        namepace: optional, if an application namespace is needed
        key prefix: for the @cache_page decorator for the function (if any)
    """
    from django.urls import reverse
    from django.http import HttpRequest
    from django.utils.cache import get_cache_key
    from django.core.cache import cache
    # create a fake request object
    request = HttpRequest()

    # lookup the request path:
    if namespace:
        view_name = namespace + ":" + view_name

    request.META = {
        'SERVER_NAME': '1.0.0.127.in-addr.arpa',
        'SERVER_PORT': 8000,
    }
    request.LANGUAGE_CODE = 'en-us'
    request.path = reverse(view_name, kwargs=args)
    # get cache key, expire if the cached item exists:
    key = get_cache_key(request, method='GET', key_prefix=key_prefix)
    if key:
        if cache.get(key):
            # Delete the cache entry.
            cache.set(key, None, 0)
        return True
    return False

request.META детали копируются из предыдущего request объекта при кэшировании get_segment_list.

Но в expire_view_cache генерируется другой cache_header ключ.

'views.decorators.cache.cache_header..9a20b800712b08ba816e521ea6b8081d.en-us.UTC'

Возможно, это связано с различными заголовками request, но я не знаю, чего не хватает в поддельном запросе.

Любая помощь будет принята с благодарностью.

Вернуться на верх