与其手动复制,不如使用
@functools.wraps()
decorator
要为您处理此问题:
from functools import wraps
def auth0_login_required(function):
@wraps(function)
def wrap(request, *args, **kwargs):
if request.isAuthenticated or request.user.is_staff:
pass
else:
raise Http404()
return function(request, *args, **kwargs)
return wrap
这个
@wraps()
装饰师(通过
functools.update_wrapper()
function it calls
知道如何处理
functools.partial
对象正确(或者更确切地说,它可以处理
功能工具.部分
对象没有
__name__
属性)。
很好,包装的
functools.partial()
在上找到的对象
View
班级没有
第二代
属性,不好的是,即使在装饰具有该属性的函数时,也不会复制该属性。如果你不想使用
@ WRAP()
您必须手动复制属性并自己处理异常:
try:
wrap.__name__ = function.__name__
except AttributeError:
pass
try:
wrap.__doc__ = function.__doc__
except AttributeError:
pass
但要考虑到这不会复制
__qualname__
,
__module__
和
__annotations__
属性,不处理在上设置的任何自定义属性
function
(其他装饰师可能依赖的)。
@functools.wrapps()函数
会处理所有这些,而且它会设置
__wrapped__
decorator包装函数的属性
would let you unwrap the decorator again
.