Кэширование для анонимных пользователей в Django

Как я могу кэшировать страницы для анонимных пользователей, но отображать их для авторизованных пользователей в Django 1.6? Раньше был флаг CACHE_MIDDLEWARE_ANONYMOUS_ONLY, который звучал идеально, но он был удален.

Я спрашиваю, потому что каждая страница имеет меню, которое отображает войти в имя пользователя и ссылку на его/ее профиль.

Что это правильно способ сделать это? Должно быть, это обычная проблема, но я не нашел правильный путь от просмотр документации Django.

4 ответов


это не требует никакого кода в представлении:

{% with cache_timeout=user.is_staff|yesno:"0,300" %}
    {% cache cache_timeout cacheidentifier user.is_staff %}
        your content here
    {% endcache %}
{% endwith %}

context = {"cache_timeout": 300 при запросе.пользователь.is_anonymous () else 0}

{% кэша нагрузки %}
{% cache cache_timeout "my-cache-fragment"%}
Я должен написать это только один раз
{% endcache %}


Я не уверен, что это "правильный" способ достижения этого, но я использую тег шаблона {% cache%}, чтобы обойти эту проблему. Динамический бит имени пользователя шаблона находится в моем базовом шаблоне, и я кэширую остальные, как показано ниже:

{% extends "base.html" %}
{% load cache %}

{% block content %}
{% cache 86400 key-name %}
<h1>My Template in here</h1>
{% endcache %}
{% endblock content %}

указав "key-name", вы можете использовать нижеприведенное для очистки кэша, если вам нужно обновить его вручную:

key = django.core.cache.utils.make_template_fragment_key('key-name')
cache.delete(key)

вы можете использовать следующий подход, создав декоратора:

def cache_for_anonim(timeout):
    def decorator(view_func):
        @wraps(view_func, assigned=available_attrs(view_func))
        def _wrapped_view(request, *args, **kwargs):

            if request.user.is_authenticated():
                return (view_func)(request, *args, **kwargs)
            else:
                return cache_page(timeout)(view_func)(request, *args, **kwargs)
        return _wrapped_view
    return decorator

затем в ваших ссылках:

url(r'^$', cache_for_anonim(3600)(MyView.as_view())),

источник: http://codeinpython.blogspot.com/2017/01/caching-for-anonymous-non-authenticated.html