Детальное кэширование страниц - PullRequest
1 голос
/ 15 января 2020

Целевая страница моего сайта кэшировалась по очевидным причинам:

url(r'^$', cache_page(7200)(vary_on_cookie(LandingPage.as_view())), name='landing_page')

Теперь мы представили новую страницу, на которую мы хотели бы перенаправить этот маршрут, если выполняются определенные условия, по сути, проверяя, есть ли у пользователя разрешение для определенного объекта:

class LandingPage(TemplateView):
    def dispatch(self, request, *args, **kwargs):
        if has_permission(self.request.user, object):
            return redirect('new_page')
        return super(LandingPage, self).dispatch(request, *args, **kwargs)

Однако, поскольку представление кэшируется, пользователь не будет перенаправлен, если исходная целевая страница уже была кэширована. И наоборот.

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

1 Ответ

1 голос
/ 15 января 2020

Вы можете переместить вызов cache_page из urls в перезаписанный метод dispatch следующим образом:

class LandingPage(TemplateView):
    def dispatch(self, request, *args, **kwargs):
        if has_permission(self.request.user, object):
            return redirect('new_page')
        cached_dispatch = cache_page(7200)(vary_on_cookie(super(
            LandingPage, self
        ).dispatch))
        return cached_dispatch(request, *args, **kwargs)

Таким образом, проверка всегда будет выполняться перед возвратом кэшированного ответа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...