django中的login_required装饰器

时间:2009-05-20 18:58:21

标签: django

在urls.py和views.py中使用login_required装饰器有什么不同吗? 如果我把这一行:

url(r'^add/$', login_required(views.add_media), name = 'add_media_action')

进入urls.py,我将获得与views.py中装饰add_media函数相同的效果:

@login_required
def add_media(request):
    ...

3 个答案:

答案 0 :(得分:31)

在Python中,装饰器是一个函数,它将函数作为参数,并返回一个装饰函数。 @login_required语法可以转换为:

def add_media(request):
  ...
add_media = login_required(add_media)

因此,如果您手动应用装饰器(如第一个片段),它应该会产生相同的效果。

如果您想同时使用视图的装饰版本和未修饰版本,则第一个代码段中的方法非常有用。

答案 1 :(得分:9)

正如其他人所指出的那样,它们确实是等同的。如果您希望采用这种方法,还需要考虑另外两件事:

  1. 在urls.py中执行此操作会从定义装饰的事物的代码中的位置离开登录要求。因此,您(或其他维护者)可能会忘记该功能已被修饰。

  2. 因为您在urls文件中应用了安全性,所以有人可能会错误地添加指向同一函数的另一个URL,但忘记将该函数包装在login_required中,从而导致出现安全漏洞。

  3. 希望有所帮助。

答案 2 :(得分:3)

是的,它们是一样的。装饰器是用于将函数包装在另一个函数中的语法糖。因此,在任何一种情况下,您都会login_required围绕views.add_media