由于@route装饰器必须使用当前提供给装饰器的回调来注册视图,因此它必须是最外层的装饰器才能在处理请求时接收正确的调用函数。
这会产生一种可能的情况,即视图已被装饰,但由于装饰器的顺序错误,因此不会调用被装饰的函数。如果用于装饰需要用户登录、具有特定角色或具有特定标志的视图,则该检查将被静默忽略。
我们当前的解决方法是让标准操作是拒绝对资源的访问,然后需要一个装饰器来允许访问。在这种情况下,如果在处理请求时未调用装饰器,则请求将失败。
但是在某些用例中,这会变得很麻烦,因为它需要您装饰所有视图,除了少数应该免除的视图。对于纯粹的分层布局,这可能有效,但对于检查单个标志,结构可能会变得复杂。
有没有一种正确的方法来检测我们在装饰层次结构中的有用位置被调用?即我们可以检测到还没有一个route装饰器应用于我们要包装的函数吗?
# wrapped in wrong order - @require_administrator should be after @app.route
@require_administrator
@app.route('/users', methods=['GET'])
实现为:
def require_administrator(func):
@functools.wraps(func)
def has_administrator(*args, **kwargs):
if not getattr(g, 'user') or not g.user.is_administrator:
abort(403)
return func(*args, **kwargs)
return has_administrator
在这里,我想检测我的自定义装饰器是否被包装在 之后@app.route,因此,在处理请求时永远不会被调用。
Usingfunctools.wraps在所有方面都用新的函数替换了被包装的函数,因此查看__name__要被包装的函数将失败。这也发生在装饰器包装过程的每一步。
我试过同时查看tracebackand inspect,但没有找到任何确定序列是否正确的体面方法。
子衿沉夜
相关分类