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