2012-09-21 85 views
3

我有一系列我正在使用的藍圖,我希望能夠將它們進一步捆綁到一個軟件包中,我可以儘可能無縫地將它們與任何其他應用程序一起使用。一攬子藍圖,爲應用程序提供整個引擎。我有點創建了我自己的解決方案,但它是手動的,需要太多的努力纔能有效。它看起來不像是一個擴展,它不止是一個藍圖(幾個提供了一個通用功能)。藍圖藍圖(燒瓶)

完成了嗎?怎麼樣?

(應用分發捆綁幾個程序一起工作的可能方法是不是我要找的)

+0

http://stackoverflow.com/a/36326234/742173 –

回答

1

最簡單的方法是創建一個函數,它接受一個Flask應用程序的實例並註冊所有一氣呵成的藍圖。事情是這樣的:

# sub_site/__init__.py 
from .sub_page1 import bp as sb1bp 
from .sub_page2 import bp as sb2bp 
# ... etc. ... 

def register_sub_site(app, url_prefix="/sub-site"): 
    app.register_blueprint(sb1bp, url_prefix=url_prefix) 
    app.register_blueprint(sb2bp, url_prefix=url_prefix) 
    # ... etc. ... 


# sub_site/sub_page1.py 
from flask import Blueprint 

bp = Blueprint("sub_page1", __name__) 

@bp.route("/") 
def sub_page1_index(): 
    pass 

或者,你可以使用類似HipPocketautoload function(全面披露:我寫HipPocket),以簡化進口處理:

# sub_site/__init__.py 
from hip_pocket.tasks import autoload 

def register_sub_site(app, 
          url_prefix="/sub-site", 
          base_import_name="sub_site"): 
    autoload(app, base_import_name, blueprint_name="bp") 

然而,由於目前爲你無法使用與示例#1相同的結構(HipPocket假定您爲每個藍圖使用軟件包)。相反,你的佈局應該是這樣的:

# sub_site/sub_page1/__init__.py 
# This space intentionally left blank 

# sub_site/sub_page1/routes.py 
from flask import Blueprint 

bp = Blueprint("sub_page1", __name__) 

@bp.route("/") 
def sub_page1_index(): 
    pass 
0

我有我自己如何裝載在配置中定義藍圖的解決方案,這樣的話你可以有類似CORE_APPS = ('core', 'admin', 'smth')的配置,當你構建應用程序,你可以註冊這些應用程序(當然,CORE_APPS中的那些字符串必須是要在Python路徑中導入的文件的名稱)。

所以我用函數來創建應用程序:

app = create_app() 

def create_app(): 
    app = Flask(__name__) 

    # I have class for my configs so configuring from object 
    app.config.from_object('configsClass') 

    # does a lot of different stuff but the main thing could help you: 
    from werkzeug.utils import import_string 
    for app in app.config['CORE_APPS'] 
    real_app = import_string(app) 
    app.register_blueprint(real_app) 

之後,你的藍圖應該註冊。當然,你可以在配置中使用不同的格式來支持自定義的URL前綴等等:)

當然你也可以在你的主要藍圖中這樣做,所以在創建應用程序時,你需要註冊那一個主要藍圖。

0

我希望Blueprint對象有一個register_blueprint函數,就像Flask對象一樣。它會自動在當前Blueprints的網址下放置和註冊藍圖。