2016-11-21 59 views
3

我遇到了一個奇怪的問題(可能對燒瓶中的經驗並不那麼奇怪)。註冊燒瓶藍圖的順序

我在谷歌App Engine的dev_appserver.py的上下文中運行的應用程序燒瓶

我有一個藍圖,在我的燒瓶應用

# rest_server.py 

rest_api = Blueprint('rest_api', __name__) 
app = Flask(__name__) 
app.register_blueprint(rest_api, url_prefix='/api') # [1] DOESN'T WORK 

@rest_api.route("/") 
def hello(): 
    return "Hello World" 

app.register_blueprint(rest_api, url_prefix="/api") # [2] WORKS AS EXPECTED 

我已經在我的app.yaml以下

-url: "/api/.*" 
script: rest_server.app 

當我在本地主機:8080/api /當我在位置[1]註冊藍圖時,出現錯誤提示沒有匹配的端點。

但是,當我註冊bluerpint在[2],任何位置after裝飾,它的作品。

是否需要在所有裝飾器之後註冊藍圖?

回答

-1

雖然您已經註冊了藍圖,但它並未實際註冊!
的一點是,你的應用程序不知道存在rest_server.py

你必須在你有下面的代碼相同的文件進行註冊:

app = Flask(__name__) 

這應該解決您的問題。



我想顯示使用我用藍圖的格局。
(這是你的代碼更好的組織有用)

藍圖模式
您的應用程序可以是這樣的:

/yourapplication 
    runserver.py 
    /application #your application is a package containing some blueprints! 
     __init__.py 
     models.py 
     /hello #(blueprint name) 
      __init__.py 
      views_file1.py 
      views_file2.py 

runserver.py應該是這樣的:

# runserver.py 

from application import app 
app.run() 


在這個例子中,Hello是一個包,你的藍圖之一:

# application/hello/__init__.py 
from flask import Blueprint 
hello = Blueprint('main', __name__) 
# import views of this blueprint: 
from application.hello import views_file1, views_file2 


導入和application/__ init__.py註冊您的藍圖。您application/__ init__.py應該是這樣的:

# application/__init__.py 

from flask import Flask 
from .hello import hello as hello_blueprint 

app = Flask(__name__) 
app.register_blueprint(hello_blueprint) 
from application.models import * #your models (classes, or *) 
0

是的,它的註冊藍圖畢竟只有他們的路線已被宣佈,至少如果你想使用這些路由所需要的。 (如果您不介意路線不可用,那麼在註冊藍圖後,看起來實際上並沒有任何聲明新路線的問題。)

如果您想知道爲什麼:基本上,只有在調用Flask.register_blueprint時,藍圖url規則纔會在應用程序中註冊。如果您在註冊藍圖後添加路線,則只需在註冊藍圖時將其添加到要做的事情列表中(Blueprint.deferred_functions),它們不會追溯添加到藍圖過去註冊的任何現有應用程序中。