2017-01-16 3 views
0

J'ai configuré la mise en cache au niveau de la page pour plusieurs de nos pages. Cependant, de temps en temps, un utilisateur admin se connecte pour prévisualiser les modifications potentielles sur le site.Django - Désactiver la mise en cache au niveau de la page par l'utilisateur

Existe-t-il un moyen de désactiver la mise en cache au niveau de la page uniquement pour ces utilisateurs? J'ai lu the docs mais je n'ai rien vu.

Mise à jour: Voilà ma tentative basée sur la réponse de 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) 

Répondre

1

Vous pouvez étendre la CacheMiddleware fournie par django tels que les utilisateurs admin voient toujours du nouveau contenu au lieu de cache.

Jetez un oeil au code source pour FetchFromCacheMiddleware, vous pouvez voir cet extrait de code:

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. 

La condition if dit ici django sauter le cache et ne pas mettre à jour les données mises en cache existantes si la méthode de requête n'est pas GET ou HEAD. De même, vous pouvez ajouter une vérification dans laquelle vous ignorez le cache si l'utilisateur est un administrateur. En gros, il ressemblera à ceci:

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

MISE À JOUR: Le décorateur cache_page utilise CacheMiddleware de django qui étend les fonctionnalités de FetchFromCacheMiddleware et UpdateCacheMiddleware.

Maintenant, vous devrez faire votre propre version de CacheMiddleware et cache_page décorateur. Ce décorateur custom_cache_page appellera votre CustomCacheMiddleware qui étend votre CustomFetchFromCacheMiddleware et UpdateCacheMiddleware de django. Après avoir complété CustomCacheMiddleware, vous devrez remplacer CacheMiddleware de django par le vôtre. Cela peut être fait en changeant MIDDLEWARE_CLASSES tuple dans settings.py.

+0

Cela semble très prometteur! Merci! Quelle est la meilleure façon de faire cela? Est-ce que je modifie le propre code source de Django, ou y a-t-il un moyen plus intelligent? – Greg

+0

Vous ne modifiez pas le code source de django, vous remplacez juste un middleware fourni par django qui est censé être remplaçable à tout moment. Tout ce que vous avez à faire est de mettre le chemin python de votre classe étendue dans votre settings.py 'MIDDLEWARE_CLASSES'. – v1k45

+0

Voulez-vous nommer ma nouvelle classe "FetchFromCacheMiddleware" pour remplacer la version de Django? Je ne vois pas "FetchFromCacheMiddleware" mentionné dans settings.py dans MIDDLEWARE_CLASSES. – Greg