2012-09-24 3 views
13

신호를 사용하여 저장된 특정 항목 하나에 대한 캐시를 제거하려고합니다.Django에서 특정 항목에 대한 캐시를 삭제할 수 없습니다.

내가 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) 
  • 문제에서 장식 (signalsrender_to)를 사용하고 내가 모델을 저장할 때, 내가 출력 "notfound key"를 얻을, 그래서 캐시는 제거하지 않고 계속
  • request.path 내 입장 경로를 제대로 가리 킵니다.

일부 설정 :

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' 
    }, 
} 

그리고보기 :

@cache_page(60 * 60) 
@render_to('artigo.html') 
def artigo(request, categoria_slug, extra_slug="", artigo_slug=""): 
    ... 

감사합니다.

는 편집 :
나는 Ilvar 변경을했고, 지금은 수익으로 "found key" 받고 있어요하지만, 난 여전히 캐시를 삭제할 수 없습니다 :

key = _generate_cache_header_key(key_prefix=settings.CACHE_MIDDLEWARE_KEY_PREFIX, request=request) 
    key = key.replace(settings.LANGUAGE_CODE, settings.LANGUAGES[0][0]) 

컨퍼런스 :

LANGUAGE_CODE = 'pt-BR' 

LANGUAGES = (
     ('pt-BR','Portugues'), 
) 
  • 을 Gevent Server를 다시 시작할 때만 컨텐츠가 업데이트됩니다.
+0

은 어떻게 든 key' '의 계산 된 값 값은 CacheMiddleware의 값과 달라야합니다, 백엔드에 있습니다. 디버거 나 print 문을 사용하여'django/middleware/cache.py'' FetchFromCacheMiddleware'와'UpdateCacheMiddleware'에서'cache_key'의 값을 관찰 해보려고합니다. – user27478

+2

문제를 재현 할 수 있는지 확인하려면 memcached 또는 redis와 같은 smth에 캐싱 엔진을 교체하십시오. – alecxe

+0

로케일을 사용하는 경우 get_cache_key는 언어 코드를 사용하여 캐시 키를 작성하고이를 코드 → 요청에 추가합니다 .LANGUAGE_CODE = settings.LANGUAGE_CODE –

답변

2

cache.set (key, None, 0)으로 충분해야합니다. 이전과 같이 캐시 키를 삭제했습니다.

가능한 경우 cache.clear()를 사용해보십시오. 모두 지울 수 있습니까? 그냥 작동하는지 확인하기 만하면됩니다.

캐시 키 중 삭제할 수없는 항목이 있습니까? 예상대로 출력됩니까?

cache.set('testkey', 'testvalue', 600) 
cache.get('testkey') 
cache.delete('testkey') 
cache.get('testkey') 
cache.set('testkey', 'testvalue2', 600) 
cache.set('testkey', 'another value', 600) 
cache.get('testkey') 

다른 캐싱 백엔드로 시도해 보셨습니까? 당신이하는 모든 일이 옳은 것처럼 보입니다.

은 아마 오류가 습관이 키 또는 뭔가 이상한 덮어 쓸 수 있도록 몇 가지 구성은 ..

관련 문제