我有一系列我正在使用的藍圖,我希望能夠將它們進一步捆綁到一個軟件包中,我可以儘可能無縫地將它們與任何其他應用程序一起使用。一攬子藍圖,爲應用程序提供整個引擎。我有點創建了我自己的解決方案,但它是手動的,需要太多的努力纔能有效。它看起來不像是一個擴展,它不止是一個藍圖(幾個提供了一個通用功能)。藍圖藍圖(燒瓶)
完成了嗎?怎麼樣?
(應用分發捆綁幾個程序一起工作的可能方法是不是我要找的)
我有一系列我正在使用的藍圖,我希望能夠將它們進一步捆綁到一個軟件包中,我可以儘可能無縫地將它們與任何其他應用程序一起使用。一攬子藍圖,爲應用程序提供整個引擎。我有點創建了我自己的解決方案,但它是手動的,需要太多的努力纔能有效。它看起來不像是一個擴展,它不止是一個藍圖(幾個提供了一個通用功能)。藍圖藍圖(燒瓶)
完成了嗎?怎麼樣?
(應用分發捆綁幾個程序一起工作的可能方法是不是我要找的)
最簡單的方法是創建一個函數,它接受一個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
或者,你可以使用類似HipPocket
的autoload
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
我有我自己如何裝載在配置中定義藍圖的解決方案,這樣的話你可以有類似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前綴等等:)
當然你也可以在你的主要藍圖中這樣做,所以在創建應用程序時,你需要註冊那一個主要藍圖。
我希望Blueprint對象有一個register_blueprint函數,就像Flask對象一樣。它會自動在當前Blueprints的網址下放置和註冊藍圖。
http://stackoverflow.com/a/36326234/742173 –