繁体   English   中英

奇怪的烧瓶蓝图行为

[英]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类的registerbefore_request方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM