Tôi đang cố gắng xóa bộ nhớ cache cho một Mục nhập cụ thể khi được lưu bằng tín hiệu.Không thể xóa bộ nhớ cache cho mục nhập cụ thể trong Django
Tôi đang sử dụng trang trí (signals
và render_to
) từ django-annoying
@signals.post_save(sender=Artigo)
def artigo_post_save(instance, **kwargs):
from django.http import HttpRequest
from django.utils.cache import get_cache_key
from django.core.cache import cache
# cache.delete(instance.get_absolute_url()) # not work
request = HttpRequest()
request.method = "GET"
request.path = '/' + instance.get_absolute_url()
print 'request path: ', request.path
key = get_cache_key(request=request,
key_prefix=settings.CACHE_MIDDLEWARE_KEY_PREFIX)
print "found key" if cache.has_key(key) else "notfound key"
if cache.has_key(key):
cache.delete(key)
cache.set(key, None, 0)
- Vấn đề là khi tôi lưu các mô hình, tôi nhận ra
"notfound key"
, vì vậy bộ nhớ cache tiếp tục mà không thanh trừng request.path
đang trỏ đúng vào đường dẫn nhập của tôi.
Một số thiết lập:
SESSION_ENGINE = "django.contrib.sessions.backends.cache"
CACHE_MIDDLEWARE_ANONYMOUS_ONLY = True
CACHE_MIDDLEWARE_KEY_PREFIX = 'cache'
CACHE_MIDDLEWARE_SECONDS = 600
CACHES = {
'default': {
'LOCATION': '',
'BACKEND': 'django.core.cache.backends.locmem.LocMemCache'
},
}
Và quan điểm:
@cache_page(60 * 60)
@render_to('artigo.html')
def artigo(request, categoria_slug, extra_slug="", artigo_slug=""):
...
Cảm ơn bạn.
EDIT:
tôi đã làm Ilvar thay đổi và bây giờ tôi nhận được "found key"
như trở lại nhưng tôi vẫn không thể xóa cache:
key = _generate_cache_header_key(key_prefix=settings.CACHE_MIDDLEWARE_KEY_PREFIX, request=request)
key = key.replace(settings.LANGUAGE_CODE, settings.LANGUAGES[0][0])
Conf:
LANGUAGE_CODE = 'pt-BR'
LANGUAGES = (
('pt-BR','Portugues'),
)
- Tôi chỉ có nội dung cập nhật khi tôi khởi động lại máy chủ Gevent.
Bằng cách nào đó giá trị giá trị tính của bạn của 'key' phải khác với giá trị từ CacheMiddleware. Tôi sẽ thử quan sát các giá trị của 'cache_key' trong' django/middleware/cache.py' 'FetchFromCacheMiddleware' và' UpdateCacheMiddleware' bằng cách sử dụng trình gỡ lỗi hoặc lệnh in. – user27478
Chỉ để kiểm tra xem sự cố có thể sao chép hay không, hãy thử thay thế công cụ lưu vào bộ nhớ cache thành smth như memcached hoặc redis. – alecxe
Nếu bạn đang sử dụng ngôn ngữ, get_cache_key cũng sử dụng mã Ngôn ngữ để tạo khóa bộ nhớ cache, thêm mã này vào mã của bạn → request.LANGUAGE_CODE = settings.LANGUAGE_CODE –