2017-04-25 59 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