2012-03-25 4 views
0

Ich habe site-wide Django caching aktiviert, aber die Anwendungen von Drittanbietern, die ich verwende, haben keine Cache-Control-Erwartungen angegeben. Ich vermute also, dass ihre Ansichten zwischengespeichert werden.Wie Django-Cache-Steuerelement auf enthaltenen URLs anwenden?

Das Problem ist, dass ich nicht möchte, dass Django die Ansichten einiger Apps zwischenspeichert. Wie wende ich URL-Level-Cache-Steuerelement auf include() an?

url(r"^account/", include("pinax.apps.account.urls")) #How to apply cache control here? 

Antwort

0

Sie können nicht. Der pro-Site-Cache wird durch Middlewares erreicht, die nur eine Anfrage und eine Antwort anstelle einer bestimmten Ansicht berücksichtigen.

Sie können dies jedoch erreichen, indem Sie eine gepatchte django.middleware.cache.FetchFromCacheMiddleware bereitstellen.

class ManagedFetchFromCacheMiddle(FetchFromCacheMiddleware): 
    def process_request(self, request): 
     if should_exempt(request): 
      request._cache_update_cache = False 
      return 
     return super(ManagedFetchFromCacheMiddle, self).process_request(request) 

def should_exempt(request): 
    """Any predicator to exempt cache on a request 
    For your case, it looks like 

    if request.path.startswith('/account/'): 
     return True 
    """ 

Ersetzen 'django.middleware.cache.FetchFromCacheMiddleware' mit dem Weg des oben in MIDDLEWARE_CLASSES.

Vielleicht generische Version von oben ist geeignet für Django Community = p

+0

Hmm commiting Patch. Also meinst du, dass ich das dann deaktivieren muss und per-view verwenden soll. – AppleGrew

+0

@AppleGrew nur eine Lösung zur Verfügung gestellt – okm

+0

Ich denke, ich werde gehen mit pro-Ansicht und pro-Vorlage-Cache, da es sich herausstellt, dass die meisten meiner Website dynamisch ist. Akzeptierte deine Antwort in der Hoffnung, dass dies anderen hilft. Eine weitere Sache, die ich mich fragte, ist vielleicht, dass es möglich ist, eine Funktion zu schreiben, die die beabsichtigte Cache-Funktion um jede eingeschlossene URL wickeln kann. Das könnte funktionieren, aber dann müssen wir zuerst überprüfen, was genau 'include()' zurückgibt. – AppleGrew

Verwandte Themen