73 votes

Les combats de mise en cache côté client dans Django

Je suis à l'aide de la render_to_response raccourci et ne veulent pas d'élaborer une Réponse spécifique à un objet pour ajouter des en-têtes supplémentaires pour empêcher la mise en cache côté client.

J'aimerais avoir une réponse qui contient:

  • Pragma: no-cache
  • Cache-control : no-cache
  • Cache-control: must-revalidate

Et tous les autres moyens astucieux que les navigateurs sera, nous l'espérons interpréter que des directives afin d'éviter la mise en cache.

Est-il un no-cache middleware ou quelque chose de semblable qui peut faire l'affaire avec un minimum de code d'intrusion?

98voto

Kristian Points 2705

Vous pouvez atteindre cet objectif en utilisant la cache_control décorateur. La Documentation est ici. Exemple dans la documentation:

from django.views.decorators.cache import never_cache

@never_cache
def myview(request):
   # ...

53voto

Meilo Points 1361

Cette approche (légère modification de L. De de Leo solution) avec un middleware qui a bien fonctionné pour moi comme un site de solution:

from django.utils.cache import add_never_cache_headers

class DisableClientSideCachingMiddleware(object):
    def process_response(self, request, response):
        add_never_cache_headers(response)
        return response

16voto

Jan Wrobel Points 2290

Pour compléter les réponses existantes. Ici est un décorateur qui ajoute des en-têtes supplémentaires pour désactiver la mise en cache:

from django.views.decorators.cache import patch_cache_control
from functools import wraps

def never_ever_cache(decorated_function):
    """Like Django @never_cache but sets more valid cache disabling headers.

    @never_cache only sets Cache-Control:max-age=0 which is not
    enough. For example, with max-axe=0 Firefox returns cached results
    of GET calls when it is restarted.
    """
    @wraps(decorated_function)
    def wrapper(*args, **kwargs):
        response = decorated_function(*args, **kwargs)
        patch_cache_control(
            response, no_cache=True, no_store=True, must_revalidate=True,
            max_age=0)
        return response
    return wrapper

Et vous pouvez l'utiliser comme:

class SomeView(View):
    @method_decorator(never_ever_cache)
    def get(self, request):
        return HttpResponse('Hello')

8voto

L. De Leo Points 1138

En fait l'écriture de mon propre middleware a été assez facile:

from django.http import HttpResponse


class NoCacheMiddleware(object):

    def process_response(self, request, response):

        response['Pragma'] = 'no-cache'
        response['Cache-Control'] = 'no-cache must-revalidate proxy-revalidate'

        return response

Encore n'a pas vraiment de se comporter comme je le voulais, mais si aucun ne vous @never_cache décorateur

6voto

Erwan Points 122

Concernant le navigateur Google Chrome (Version 34.0.1847.116 m) et les autres navigateurs, j'ai trouvé que seul l' @cache_control décorateur travaille. J'utilise Django 1.6.2.

L'utiliser comme ceci:

@cache_control(max_age=0, no_cache=True, no_store=True, must_revalidate=True)
def view(request):
    ...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X