我有一系列我正在使用的蓝图,我希望能够将它们进一步捆绑到一个包中,我可以尽可能无缝地使用任何数量的其他应用程序。一组蓝图,为应用程序提供整个引擎。我创建了自己的解决方案,但它是手动的,需要付出太多努力才能有效。它似乎不是一个扩展,它不止一个蓝图(几个提供了一个共同的功能)。
这样做了吗?怎么样?
(捆绑几个程序的应用程序调度方法可能不起作用)
答案 0 :(得分:2)
我希望Blueprint对象具有register_blueprint函数,就像Flask对象一样。它会自动在当前蓝图的网址下放置和注册蓝图。
答案 1 :(得分: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
或者,您可以使用类似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
答案 2 :(得分:0)
我自己有如何加载配置中定义的蓝图的解决方案,因此您可以在配置中使用CORE_APPS = ('core', 'admin', 'smth')
之类的内容,当您构建应用程序时,您可以注册这些应用程序(当然,CORE_APPS中的这些字符串必须是要在python路径中导入的文件的名称。)
所以我正在使用函数创建app:
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前缀等等,以此类推:)
当然,您也可以在主蓝图中执行类似的操作,因此在创建应用程序时,您需要注册一个主要蓝图。
答案 3 :(得分:0)
看看这个:嵌套蓝图 → https://flask.palletsprojects.com/en/2.0.x/blueprints/#nesting-blueprints
parent = Blueprint('parent', __name__, url_prefix='/parent')
child = Blueprint('child', __name__, url_prefix='/child')
parent.register_blueprint(child)
app.register_blueprint(parent)