我使用的是烧瓶-RESTful,并试图使用显示了这里的技术来获得我的休息端点。
主要代码是
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.)似乎用@wraps包装的函数被传递给包装器,那么包装器返回的是什么?
可能的答案:最初传递给函数的所有内容?
如果是的话,我如何传递更多的信息,比如acct对象,这样我的函数就可以接收帐户对象,而不必为其进行数据库提取了?
基于示例的更新,我的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并再次从validUUID获取acct对象。
我怎样才能做到这一点?
发布于 2013-04-09 04:35:27
authenticate是一个装饰器--它接受一个函数并返回该函数的修改版本(通常是通过包装该函数并包装它来实现的)。
现在,包装器的问题是,它们在某些方面通常不完全像原始函数--它们可能缺少文档字符串,有错误的__name__ (wrapper而不是应该调用的),以及其他缺陷。如果其他代码正在使用这些额外信息,这可能是很重要的。functools.wraps是一个简单的函数,它将原始函数(此处为func)中的信息添加到包装器函数中,因此它的行为更像原始函数。(从技术上讲,它本身就是一个装潢师,这是令人困惑的地方,但你不必担心这个细节。只需知道,它是一个很好的工具,可以将属性从包装函数复制到包装函数)。
因此,当你写
new_function = authenticate(old_function)或者更常见
@authenticate
def function(...)new_function看起来更像old_function。
https://stackoverflow.com/questions/15893321
复制相似问题