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

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

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

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


person Nixarn    schedule 19.01.2014    source источник


Ответы (4)


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

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

context = {"cache_timeout": 300, если request.user.is_anonymous() еще 0}

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

person Neeraj Sharma    schedule 24.02.2014

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

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

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

Указав «имя ключа», вы можете использовать приведенное ниже представление, чтобы очистить кеш, если вам нужно обновить его вручную:

key = django.core.cache.utils.make_template_fragment_key('key-name')
cache.delete(key)
person guyf    schedule 17.02.2014

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

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-адресах:

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

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

person Sergey    schedule 30.01.2017
comment
Почему минус? Это похоже на лучшее решение. - person EralpB; 15.03.2018