[英]Strange Flask Blueprint behaviour
我有此代码(工作):
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()
有人可以解释一下,这是怎么回事? 为什么订单很重要?
原因是Flask应用程序不会直接使用给定的Blueprint对象,而是在注册时借助BlueprintSetupState
类将其状态保存在应用程序中。 如果在注册后修改了蓝图对象,则该对象不会影响先前保存的状态。
有关更多详细信息,请参见Flask源代码中的BlueprintSetupState
类,其类文档中指出以下内容:
临时持有人对象,用于向应用程序注册蓝图。 此类的实例由:meth:
~flask.Blueprint.make_setup_state
方法创建,然后传递给所有寄存器回调函数。
编辑 :我以前的答案有点误导,因为回调未保存在BlueprintSetupState
实例中,而是保存在App实例中。 例如,当您使用before_request
为某个函数在每个请求之前运行时,该给定函数将在注册时添加到该应用实例的before_request_funcs
列表中。 这就是为什么注册后更改回调无效。 请参阅Blueprint
类的register
和before_request
方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.