Python 了解functools.wrapps
我正在使用Flask RESTful,并尝试使用该技术显示我的REST端点 主要代码是Python 了解functools.wrapps,python,Python,我正在使用Flask RESTful,并尝试使用该技术显示我的REST端点 主要代码是 def authenticate(func): @wraps(func) def wrapper(*args, **kwargs): if not getattr(func, 'authenticated', True): return func(*args, **kwargs) acct = basic_authentication(
def authenticate(func):
@wraps(func)
def wrapper(*args, **kwargs):
if not getattr(func, 'authenticated', True):
return func(*args, **kwargs)
acct = basic_authentication() # custom account lookup function
if acct:
return func(*args, **kwargs)
restful.abort(401)
return wrapper
class Resource(restful.Resource):
method_decorators = [authenticate] # applies to all inherited resources
我也用同样的方法做了,但我不确定@wraps
?这对我来说似乎很神奇,我不明白下面的内容 a、 )似乎用
@wrapps
包装的函数被传递给了包装器,那么包装器返回了什么
可能的答案:最初传递给函数的所有内容
如果是,我如何将更多信息(如acct
对象)与所有内容一起传递,以便我的函数接收account对象,而不必为其执行数据库获取
更新
根据该示例,我的rest端点如下所示
class UserResource(RestResource):
def get(self, uuid):
return {'method': 'get user -> ' + uuid}
我把它叫做
curl -X GET http://127.0.0.1:5000/users/validUUID
现在,当我的每个请求都经过身份验证时,我会查看是否存在有效的acct
对象,如果它存在,我会将控件委托给端点
问题:由于我实际上是在进行一次数据库调用以查找
acct
对象,因此当找到有效的acct
时,是否可以将其传递到端点
这样会发生两件事a、 )我知道电话已通过身份验证
b、 )我重复使用
acct
对象,我可以将其用于我的进一步工作,而不是再次进行DB调用并再次从ValidUID获取acct
对象
如何实现这一点?
authenticate
是一个修饰符——它接受一个函数并返回该函数的修改版本(通常通过包装函数并包装它来实现)
现在,包装器的问题在于,它们在某些方面的行为与原始函数并不完全相同——它们可能缺少docstring,具有错误的\uuuuu name\uuuuuuuu
(wrapper
,而不是它应该被调用的内容)和其他缺陷。如果其他代码正在使用这些额外信息,这可能很重要functools.wrapps
是一个简单的函数,它将原始函数(此处为func
)中的信息添加到包装函数中,因此它的行为更像原始函数。(从技术上讲,它本身就是一个装饰器,这是令人困惑的部分,但您不必担心这个细节。只需知道它是一个很好的工具,可以将属性从包装函数复制到包装函数)
因此,当你写作时
new_function = authenticate(old_function)
或者更常见
@authenticate
def function(...)
new\u function
看起来更像old\u function
authenticate
是一个装饰器——它接受一个函数并返回该函数的修改版本(通常通过包装函数并包装它来实现)
现在,包装器的问题在于,它们在某些方面的行为与原始函数并不完全相同——它们可能缺少docstring,具有错误的\uuuuu name\uuuuuuuu
(wrapper
,而不是它应该被调用的内容)和其他缺陷。如果其他代码正在使用这些额外信息,这可能很重要functools.wrapps
是一个简单的函数,它将原始函数(此处为func
)中的信息添加到包装函数中,因此它的行为更像原始函数。(从技术上讲,它本身就是一个装饰器,这是令人困惑的部分,但您不必担心这个细节。只需知道它是一个很好的工具,可以将属性从包装函数复制到包装函数)
因此,当你写作时
new_function = authenticate(old_function)
或者更常见
@authenticate
def function(...)
new\u function
将看起来更像old\u function
谢谢@nneonneo,我刚刚添加了更新,看看我所做的是否可以实现,请让我知道我必须承认我不太理解你的更新要求。谢谢@nneonneo,我刚刚添加了更新,看看我所做的是否可以实现,请让我知道我必须承认我不太明白你的更新要求什么。