2017-01-16 4 views
0

Я установил кеширование уровня страницы для многих наших страниц. Однако время от времени администратор регистрируется, чтобы просмотреть потенциальные изменения на сайте.Django - Отключить кэширование уровня страницы пользователем

Есть ли способ отключить кеширование уровня страницы только для этих пользователей?

Я прочитал the docs, но ничего не увидел.

Update: Вот моя попытка на основе ответа v1k45 в:

from django.middleware.cache import FetchFromCacheMiddleware 


logger = logging.getLogger(__name__) 


class ExceptImpersonateFetchFromCacheMiddleware(FetchFromCacheMiddleware): 
    def process_request(self, request): 
     # Break out of caching is we're using impersonate 
     if request.user and hasattr(request.user, 'is_impersonate') and request.user.is_impersonate: 
      logger.warning("Skipping cache_page for user %s because it is impersonation" % str(request.user)) 
      request._cache_update_cache = False 
      return None 
     # Normal flow: 
     return super(ExceptImpersonateFetchFromCacheMiddleware, self).process_request(request) 

ответ

1

Вы можете продлить CacheMiddleware предоставленного Джанго таким образом, чтобы всегда видеть пользователи администратора нового содержания, а не кэшируются.

Посмотрите на исходный код для FetchFromCacheMiddleware, вы можете увидеть этот фрагмент кода:

def process_request(self, request): 
    [...] 
    if request.method not in ('GET', 'HEAD'): 
     request._cache_update_cache = False 
     return None # Don't bother checking the cache. 

В, если условие здесь говорит Джанго, чтобы пропустить кэш и не обновлять существующие данные в кэше, если метод запроса не является GET или HEAD.

Аналогичным образом вы можете добавить чек, в котором вы пропустите кеш, если пользователь является администратором. Примерно это будет выглядеть следующим образом:

def process_request(self, request): 
    [...snip..] 
    if request.user.is_staff: 
     request._cache_update_cache = False 
     return None # Don't bother checking the cache. 

UPDATE: cache_page декоратор использует Джанго CacheMiddleware, которая расширяет функциональные возможности FetchFromCacheMiddleware и UpdateCacheMiddleware.

Теперь вам нужно будет сделать свою собственную версию CacheMiddleware и cache_page декоратор. Этот декоратор custom_cache_page позвонит вашему CustomCacheMiddleware, который продлит ваши CustomFetchFromCacheMiddleware и django's UpdateCacheMiddleware.

После того, как вы завершили CustomCacheMiddleware, вам придется заменить CacheMiddleware django на свой собственный. Это можно сделать, изменив кортеж MIDDLEWARE_CLASSES в settings.py.

+0

Это выглядит очень перспективно! Благодаря! Каков наилучший способ сделать это? Могу ли я модифицировать собственный исходный код Django, или есть более разумный способ? – Greg

+0

Вы не изменяете исходный код django, вы просто заменяете промежуточное программное обеспечение, предоставляемое django, которое предназначено для замены в любое время. Все, что вам нужно сделать, это поместить ваш расширенный путь «python» в ваши settings.py «MIDDLEWARE_CLASSES». – v1k45

+0

Вы хотите назвать мой новый класс «FetchFromCacheMiddleware», чтобы переопределить версию Django? Я не вижу «FetchFromCacheMiddleware», упомянутый в settings.py в MIDDLEWARE_CLASSES. – Greg

 Смежные вопросы

  • Нет связанных вопросов^_^