我有这个代码(工作):
bp = Blueprint(...)
@bp.before_request
def before_request():
if self.auth_callback is not None:
return self.auth_callback()
self.app.register_blueprint(
bp,
url_prefix=self.config.get("FILE_UPLOAD_PREFIX")
)
这不起作用:
bp = Blueprint(...)
self.app.register_blueprint(
bp,
url_prefix=self.config.get("FILE_UPLOAD_PREFIX")
)
@bp.before_request
def before_request():
if self.auth_callback is not None:
return self.auth_callback()
有人可以解释一下,这里发生了什么?为什么订单很重要?
答案 0 :(得分:2)
原因是Flask应用程序不能直接使用给定的Blueprint对象,但在BlueprintSetupState
类的帮助下在注册时将其状态保存在应用程序中。如果在注册后修改Blueprint对象,它将对以前保存的状态没有影响。
有关详细信息,请参阅Flask sources中的BlueprintSetupState
类,其类文档说明了以下内容:
用于注册蓝图的临时持有者对象 应用。这个类的一个实例是由 :meth:
~flask.Blueprint.make_setup_state
方法,后来通过了 所有注册回调函数。
修改强>:
我之前的回答有点误导,因为回调没有保存在BlueprintSetupState
实例中,而是保存在App实例中。例如,当您使用before_request
在每个请求之前运行函数时,给定的函数将添加到注册的应用实例的before_request_funcs
列表中。这就是注册后更改回调无效的原因。请参阅register
类的before_request
和Blueprint
方法。