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

aus*_*nce 1 python flask python-3.x flask-login

我正在尝试从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
Run Code Online (Sandbox Code Playgroud)

来源:

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
Run Code Online (Sandbox Code Playgroud)

请原谅复制/粘贴的不良缩进.

问题:当我使用我的函数进行换行时,它无法获得第一个参数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'
Run Code Online (Sandbox Code Playgroud)

必须有一些小事,我不是那么聪明.谢谢你的时间.

pok*_*oke 10

login_role_required应该是一个返回装饰器函数的函数,该函数又接受一个参数 - 装饰函数 - 并返回一个修改过的函数.所以看起来应该是这样的:

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
Run Code Online (Sandbox Code Playgroud)