我正在使用 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() # 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
包含所有内容的对象,以便我的函数接收帐户对象并且我不必为它进行数据库获取?
更新 基于示例,我的休息端点看起来像
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 并再次acct
从 validUUID 获取对象
我怎样才能做到这一点?