奇怪的烧瓶蓝图行为

时间:2017-04-25 07:32:48

标签: python flask

我有这个代码(工作):

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()

有人可以解释一下,这里发生了什么?为什么订单很重要?

1 个答案:

答案 0 :(得分:2)

原因是Flask应用程序不能直接使用给定的Blueprint对象,但在BlueprintSetupState类的帮助下在注册时将其状态保存在应用程序中。如果在注册后修改Blueprint对象,它将对以前保存的状态没有影响。

有关详细信息,请参阅Flask sources中的BlueprintSetupState类,其类文档说明了以下内容:

  

用于注册蓝图的临时持有者对象   应用。这个类的一个实例是由   :meth:~flask.Blueprint.make_setup_state方法,后来通过了   所有注册回调函数。

修改: 我之前的回答有点误导,因为回调没有保存在BlueprintSetupState实例中,而是保存在App实例中。例如,当您使用before_request在每个请求之前运行函数时,给定的函数将添加到注册的应用实例before_request_funcs列表中。这就是注册后更改回调无效的原因。请参阅register类的before_requestBlueprint方法。