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
, но я не знаю, чего не хватает в поддельном запросе.
Любая помощь будет принята с благодарностью.