2017-04-25 64 views
0

我有这样的代码(工作):奇怪瓶蓝图行为

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

有人能解释我,发生了什么这里PLZ?为什么订单重要?

回答

2

原因是Flask应用程序不会直接使用给定的Blueprint对象,而是通过BlueprintSetupState类的帮助将其状态保存在应用程序中。如果您在注册后修改了Blueprint对象,它将不会影响先前保存的状态。

看到Flask sourcesBlueprintSetupState类更多的细节,其类文档指出以下几点:

登记与 应用的蓝图

临时保持对象。该类的一个实例由 :meth:~flask.Blueprint.make_setup_state方法创建,稍后将 传递给所有寄存器回调函数。

编辑: 我以前的答案是有点误导,因为回调不保存在BlueprintSetupState实例,但在App实例。例如,当您在before_request的每个请求之前提供运行函数时,给定函数将被添加到应用程序实例before_request_funcs列表中,其登记号为。这就是为什么注册后改变回调没有任何作用。请参见Blueprint类的registerbefore_request方法。

+0

这意味着我不能添加包装到蓝图除了使用和注册回调?或者还有其他方法吗? 很好的顺便说一句,谢谢你的信息, – Speedy

+1

不客气。我意识到我的答案缺乏一些信息,所以我在最后添加了一个注释来解决它。包装是什么意思?你的意思是装饰者? –

+0

我的意思是装饰者。但是你的编辑也已经回答了这个问题。非常感谢你 – Speedy