【问题标题】:Wrapping/decorating a function in urls.py vs in views.py在 urls.py 与 views.py 中包装/装饰函数
【发布时间】:2011-08-13 09:43:03
【问题描述】:

所以,我非常熟悉在views.py 中包装函数。所以我写了一个装饰器来重定向到默认的 REDIRECT_URL 如果用户 登录(有点反向login_required);这是基于我过去的观点:

def not_logged_in(redirect_url=None, redirect_field_name=REDIRECT_FIELD_NAME):
    def decorator(view_func, *args, **kwargs):
        def wrapper(request, *args, **kwargs):
            if not request.user.is_authenticated():
                return view_func(*args, **kwargs)
            else:
                redirect_url = (request.REQUEST.get(redirect_field_name, redirect_url) or
                                settings.REDIRECT_URL)
                return HttpResponseRedirect(redirect_url)
        return wrapper
    return decorator

但是,我收到以下错误:'function' object has no attribute 'status_code' 这是由期望 HttpResponse 的 MiddleWare 引起的。当我查看response 的值时,我发现它是<function wrapper at 0x2b3a9922a500>

这就是我在urls.py 中的称呼:

url(r'login/', 
     not_logged_in(auth_views.login), 
     {'authentication_form': LoginForm },
),

【问题讨论】:

  • 你的问题是你的装饰器没有被使用。相反,您将 函数返回给url() 的第二个参数。你的装饰器看起来不错,但你应该像这样使用它:not_logged_in(<your arguments>)(<view callable>)

标签: django decorator


【解决方案1】:

这是我对同一件事的实现。

def logout_required(view):
    def f(request, *args, **kwargs):
        if request.user.is_anonymous():
            return view(request, *args, **kwargs)
        return HttpResponseRedirect(settings.LOGIN_REDIRECT_URL)
    return f

urls.py:

urlpatterns = patterns("",
    url(r"^login/", logout_required(login), {"template_name": "users/login.html"}, "login"),
    # ...

我希望这会有所帮助(虽然不确定)。

【讨论】:

    【解决方案2】:

    装饰器的第一个参数应该是需要装饰的函数。

    def not_logged_in(func, redirect_url=None, redirect_field_name=REDIRECT_FIELD_NAME):
    

    也不需要装饰器功能。从 not_logged_in 返回包装函数。

    【讨论】:

      【解决方案3】:

      您实现装饰器的方式是参数化的,因此是可调用的:这就是为什么您拥有 fizixx 错误地认为不需要的额外功能级别的原因。您最初需要调用外部包装器,以便返回实际的装饰函数。所以像:

      url(r'login/', 
       not_logged_in(auth_views.login)('/redirect/', 'redirect_field'), 
       {'authentication_form': LoginForm },
      ),
      

      【讨论】:

      • 嗯......这也不起作用。我想我对装饰器一直不清楚的一件事是需要多少嵌套函数,或者为什么。
      猜你喜欢
      • 2020-06-15
      • 1970-01-01
      • 2017-11-05
      • 2011-10-04
      • 2011-06-25
      • 2010-10-14
      • 2021-04-06
      • 2015-09-03
      • 2017-09-13
      相关资源
      最近更新 更多