Skip to main content
 首页 » 编程设计

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

2025年05月04日12lidabo

我正在尝试从 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 

请原谅复制/粘贴的错误缩进。

问题:当我使用我的函数进行换行时,它无法获取第一个参数 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 应该是一个返回装饰函数的函数,装饰函数又接受一个参数——装饰函数——并返回修改后的函数。所以它应该是这样的:

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