所以,我非常熟悉在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'
这是由MiddleWare期望HttpResponse引起的。当我查看response
的值时,我发现它是<function wrapper at 0x2b3a9922a500>
。
以下是我在urls.py
中调用它的方式:
url(r'login/',
not_logged_in(auth_views.login),
{'authentication_form': LoginForm },
),
答案 0 :(得分:8)
这是我对同样事情的实现。
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"),
# ...
我希望这会有所帮助(不确定)。
答案 1 :(得分:1)
装饰器的第一个参数应该是需要装饰的函数。
def not_logged_in(func, redirect_url=None, redirect_field_name=REDIRECT_FIELD_NAME):
也不需要装饰器功能。从not_logged_in返回包装函数。
答案 2 :(得分:1)
你实现装饰器的方式,它是参数化的,因此可以调用:这就是为什么你得到了fizixx错误地说不需要的额外功能。您最初需要调用外部包装器,以便返回实际的修饰函数。如下所示:
url(r'login/',
not_logged_in(auth_views.login)('/redirect/', 'redirect_field'),
{'authentication_form': LoginForm },
),