【发布时间】:2015-03-20 07:53:26
【问题描述】:
我有很多方法需要授权。因此,与其一遍又一遍地编写相同的代码,我想简化它。据我了解,我不能使用@login_required,因为它重定向到我没有的登录页面。 (用户通过所有模板中包含的下拉菜单登录系统)。我只想在没有任何重定向的情况下提高 PermissionDenied。
get_profile(request):
if request.user.is_authenticated():
do things
else:
raise PermisionDenied
一种解决方案是使用自定义装饰器:
def login_required_no_redirect(f):
def wrap(request, *args, **kwargs):
if request.user.is_authenticated():
return f(request, *args, **kwargs)
else:
raise PermissionDenied
wrap.__doc__ = f.__doc__
wrap.__name__ = f.__name__
return wrap
但它需要在里面传递一个函数。所以我不能只将@login_required_no_redirect() 放在方法上方。它需要传递一些函数作为参数。我在哪里得到它?没有参数的django装饰器很多,类似的怎么写?
最好的问候,
【问题讨论】:
-
我认为你并不完全了解装饰器。当您在函数上方执行
@login_required时(注意:没有括号),您实际上是将函数作为参数传递给login_required装饰器。通过在视图函数上方使用@login_required_no_redirect(不带括号!),您上面编写的装饰器可以像任何其他装饰器一样轻松应用。
标签: python django python-decorators