如何使用django自定义装饰器

时间:2015-03-20 07:53:26

标签: python django python-decorators

我有很多需要授权的方法。因此,我不是一遍又一遍地编写相同的代码,而是想简化它。据我所知,我无法使用@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装饰器,如何编写类似的装饰?

致以最诚挚的问候,

1 个答案:

答案 0 :(得分:1)

Django已有一个@permission_required装饰器。

  

如果给出了raise_exception参数,则装饰器将引发PermissionDenied,提示403(HTTP Forbidden)视图,而不是重定向到登录页面。