Python 中使用装饰器对在运行期对函数进行一些外部功能的扩展。可是在使用过程当中,因为装饰器的加入致使解释器认为函数自己发生了改变,在某些状况下——好比测试时——会致使一些问题。Python 经过 functool.wraps
为咱们解决了这个问题:在编写装饰器时,在实现前加入 @functools.wraps(func)
能够保证装饰器不会对被装饰函数形成影响。好比,在 Flask 中,咱们要本身重写 login_required
装饰器,但不想影响被装饰器装饰的方法,则 login_required
装饰器自己能够写成下面的样子:python
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 redirect(url_for("login.loginPage", next=request.url)) return func(*args, **kwargs) return decorated_view