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

У меня есть представление, которое я хочу кэшировать только для неавторизованных пользователей. Вид должен быть примерно таким:

@cache_page_for_guests(60 * 15)
def my_view(request):

Я просмотрел docs, но не смог найти подсказок по этому поводу.

На самом деле мой вопрос точно такой же, как этот, который без ответа, и я не мог понять комментарии.

Так что ценю вашу помощь.


person Milkyway    schedule 04.04.2019    source источник


Ответы (2)


Напишите собственный декоратор следующим образом:

from django.views.decorators.cache import cache_page

def cache_page_for_guests(cache_life_span):
    def decorator(view_func):
        @wraps(view_func, assigned=available_attrs(view_func))
        def _wrapped_view(request, *args, **kwargs):
            return cache_page(cache_life_span, key_prefix="_auth_%s_" % not request.user.is_authenticated())(view_func)(request, *args, **kwargs)
        return _wrapped_view
    return decorator

Тогда в поле зрения

@cache_page_for_guests(60 * 15)
def my_view(request):
person shafik    schedule 04.04.2019
comment
Я получаю синтаксическую ошибку в return cache_page(cache_life_span, key_prefix="_auth_%s_" % not request.user.is_authenticated())(view_func)(request, *args, **kwargs) - person Milkyway; 04.04.2019
comment
Попробуйте это return cache_page(cache_life_span, key_prefix="_auth_%s_" % request.user.is_authenticated() is False)( view_func)(request, *args, **kwargs) - person shafik; 04.04.2019
comment
Теперь я получаю ошибку NameError: global name 'wraps' is not defined. - person Milkyway; 04.04.2019
comment
Импортируйте вот так from django.utils.six import wraps - person shafik; 04.04.2019
comment
Теперь я получаю NameError: global name 'available_attrs' is not defined - person Milkyway; 04.04.2019
comment
из django.utils.decorators импортировать available_attrs - person shafik; 04.04.2019
comment
Ошибка ушла, но декоратор работает некорректно: Кеширует страницу и для аутентифицированного пользователя. Поэтому мне пришлось не принять ваш ответ. - person Milkyway; 04.04.2019

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


def cache_page_for_guests(*cache_args, **cache_kwargs):
    def inner_decorator(func):
        @wraps(func)
        def inner_function(request, *args, **kwargs):
            if not request.user.is_authenticated:
                return cache_page(*cache_args, **cache_kwargs)(func)(request, *args, **kwargs)
           return func(request, *args, **kwargs)
        return inner_function
    return inner_decorator

вы можете использовать cache_page_for_guest так же, как cache_page. Он будет принимать те же аргументы, что и cache_page. В зависимости от аутентификации пользователя он покажет либо обычное представление, либо кешированное представление.

@cache_page_for_guests(60 * 15)
def my_view(request):
person Dharanidhar Reddy    schedule 04.04.2019