Python 3.4 中的包装函数缺少必需的位置参数

Wrapping Functions in Python 3.4 missing required positional argument

我正在尝试从 Flask-Login 包中自定义一个 login_required 装饰器。我已经阅读了源代码并模仿了语法。

我的:

def login_role_required(f, req_roles=['any']):
@wraps(f)
def decorated_view(*args, **kwargs):
    if current_app.login_manager._login_disabled:
        return f(*args, **kwargs)
    if not current_user.is_authenticated():
        return current_app.login_manager.unauthorized()

    if req_roles == ['any']:
        return f(*args, **kwargs)
    user_roles = current_user.get_roles

    # Check to make sure all required roles are had by user
    for r in req_roles:
        if r not in user_roles:
            current_app.login_manager.unauthorized()
    return f(*args, **kwargs)
return decorated_view

来源

def login_required(func):
@wraps(func)
def decorated_view(*args, **kwargs):
    if current_app.login_manager._login_disabled:
        return func(*args, **kwargs)
    elif not current_user.is_authenticated():
        return current_app.login_manager.unauthorized()
    return func(*args, **kwargs)
return decorated_view

请原谅 copy/paste 的错误缩进。

问题:当我使用我的函数进行换行时,它无法获取第一个参数 f(函数)。

@app.route('/shutdown', methods=['POST'])
@login_role_required(req_roles=['admin'])
def shutdown_server():
   pass

TypeError: login_role_required() missing 1 required positional argument: 'f'

肯定是有什么地方做得不够巧妙。谢谢你的时间。

login_role_required 应该是一个 returns 修饰函数的函数,它又接受一个参数——修饰函数——和 returns 修饰函数。所以它应该是这样的:

def login_role_required(req_roles = None):
    if req_roles is None:
        req_roles = ['any']

    def decorator (f):
        def decorated_view(*args, **kwargs):
            # …
            return f(*args, **kwargs)
        return decorated_view

    return decorator