【问题标题】:How to cache a view only for unauthenticated users?如何仅为未经身份验证的用户缓存视图?
【发布时间】:2019-08-26 12:20:28
【问题描述】:

我有一个视图,我只想为未经身份验证的用户缓存它。 视图应该是这样的:

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

我查看了docs,但找不到任何关于此的提示。

实际上我的问题与this 完全一样,没有答案,我无法理解 cmets。

非常感谢您的帮助。

【问题讨论】:

    标签: django django-cache


    【解决方案1】:

    像这样编写自定义装饰器:

    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):
    

    【讨论】:

    • return cache_page(cache_life_span, key_prefix="_auth_%s_" % not request.user.is_authenticated())(view_func)(request, *args, **kwargs) 出现语法错误
    • 试试这个return cache_page(cache_life_span, key_prefix="_auth_%s_" % request.user.is_authenticated() is False)( view_func)(request, *args, **kwargs)
    • 现在我收到NameError: global name 'wraps' is not defined 错误。
    • 像这样导入from django.utils.six import wraps
    • 从 django.utils.decorators 导入 available_attrs
    【解决方案2】:
    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 一样使用cache_page_for_guest。它将接受与cache_page 相同的参数。根据用户的身份验证,它将显示普通视图或缓存视图。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-07-24
      • 1970-01-01
      • 2020-11-15
      • 2015-06-21
      • 2017-09-11
      • 2020-11-04
      • 2012-05-08
      • 2012-02-29
      相关资源
      最近更新 更多