Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
django中的登录\所需装饰程序_Django - Fatal编程技术网

django中的登录\所需装饰程序

django中的登录\所需装饰程序,django,Django,在url.py和views.py中使用login_required decorator有什么区别吗? 如果我这样说: url(r'^add/$', login_required(views.add_media), name = 'add_media_action') 在URL.py中,我将实现与在views.py中装饰add_media函数相同的效果: @login_required def add_media(request): ... 在Python中,decorator是一个函

在url.py和views.py中使用login_required decorator有什么区别吗? 如果我这样说:

url(r'^add/$', login_required(views.add_media), name = 'add_media_action')
在URL.py中,我将实现与在views.py中装饰add_media函数相同的效果:

@login_required
def add_media(request):
    ...

在Python中,decorator是一个函数,它将函数作为参数,并返回一个修饰函数。所需的
@login_
语法可以翻译为:

def add_media(request):
  ...
add_media = login_required(add_media)
因此,如果您手动应用装饰器(如第一个代码片段中所示),它应该会产生相同的效果


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

是的,它们是相同的。修饰符是将一个函数包装到另一个函数中的语法糖。因此,在这两种情况下,您都将
login\u required
包装在
视图周围。添加媒体

正如其他人所指出的,它们确实是等效的。如果你想采用这种方法,需要考虑另外两件事:

  • 在urls.py中执行此操作将使登录要求与代码中定义装饰的地方分离。因此,您(或其他维护人员)可能会忘记该函数已经过修饰

  • 由于您在URL文件中应用了安全性,因此可能有人错误地添加了指向同一函数的另一个URL,但忘记将该函数包装在login_required中,从而导致安全漏洞

  • 希望有帮助