2012-03-25 3 views
0

Я включил site-wide Django caching, но сторонние приложения, которые я использую, не указали никаких ожиданий по управлению кешем. Итак, я предполагаю, что их взгляды будут кэшироваться.Как применить контроль кеша Django по включенным URL-адресам?

Проблема в том, что я не хочу, чтобы Django кэшировал представления некоторых приложений. Как применить управление кешем уровня на уровне include()?

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

ответ

0

Вы не можете. Кэш каждого сайта достигается с помощью посредников, которые рассматривают только запрос и ответ вместо определенного вида.

Однако вы можете достичь этого, предоставив исправленную django.middleware.cache.FetchFromCacheMiddleware.

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 
    """ 

Заменить '' django.middleware.cache.FetchFromCacheMiddleware с пути выше в MIDDLEWARE_CLASSES.

Возможно, общий вариант выше подходит для внесения патча в сообщество Django = p

+0

Хмм. Таким образом, вы имеете в виду, что мне придется отключить это и использовать per-view. – AppleGrew

+0

@AppleGrew просто предоставил решение – okm

+0

Я предполагаю, что подойду для каждого представления и кеша для каждого шаблона, так как, как выясняется, большая часть моего сайта динамична. Принял ваш ответ в надежде, что это поможет другим. Еще одна вещь, о которой мне было интересно, может быть, можно написать функцию, которая может обернуть предполагаемую функцию кеша вокруг каждого включенного URL-адреса. Это может сработать, но тогда нам нужно сначала проверить, что именно возвращает 'include()'. – AppleGrew