django中的login_required装饰器

Kon*_*tin 17 django

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

url(r'^add/$', login_required(views.add_media), name = 'add_media_action')
Run Code Online (Sandbox Code Playgroud)

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

@login_required
def add_media(request):
    ...
Run Code Online (Sandbox Code Playgroud)

Aym*_*ieh 31

在Python中,装饰器是一个函数,它将函数作为参数,并返回一个修饰函数.该@login_required语法可以翻译为:

def add_media(request):
  ...
add_media = login_required(add_media)
Run Code Online (Sandbox Code Playgroud)

因此,如果您手动应用装饰器(如在第一个片段中),它应该生成相同的效果.

如果要同时使用视图的装饰版本和未修饰版本,则第一个代码段中的方法很有用.

  • +1特别适用于最后一句中的注释. (9认同)

Jar*_*die 9

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

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

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

希望有所帮助.