【问题标题】:How to use django custom decorator如何使用 django 自定义装饰器
【发布时间】: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


【解决方案1】:

Django 已经为此提供了一个 @permission_required 装饰器。

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

【讨论】:

  • 只是出于好奇,我该如何解决自定义装饰器的问题?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-07
  • 1970-01-01
  • 2011-07-25
  • 2021-11-25
  • 2013-02-06
  • 2011-10-16
  • 2015-03-25
相关资源
最近更新 更多