我有一系列正在使用的蓝图,我希望能够将它们进一步捆绑到一个包中,我可以尽可能无缝地与任何数量的其他应用程序一起使用。为应用程序提供整个引擎的一组蓝图。我有点创建了自己的解决方案,但它是手动的,需要付出太多努力才能有效。它看起来不像是一个扩展,它不仅仅是一个蓝图(几个提供通用功能的蓝图)。
这完成了吗?如何?
(将几个程序捆绑在一起的应用程序调度方法可能不是我想要的)
我有一系列正在使用的蓝图,我希望能够将它们进一步捆绑到一个包中,我可以尽可能无缝地与任何数量的其他应用程序一起使用。为应用程序提供整个引擎的一组蓝图。我有点创建了自己的解决方案,但它是手动的,需要付出太多努力才能有效。它看起来不像是一个扩展,它不仅仅是一个蓝图(几个提供通用功能的蓝图)。
这完成了吗?如何?
(将几个程序捆绑在一起的应用程序调度方法可能不是我想要的)
我希望 Blueprint 对象有一个 register_blueprint 函数,就像 Flask 对象一样。它会自动在当前蓝图的 url 下放置和注册蓝图。
看看这个:嵌套蓝图→ 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)
The simplest way would be to create a function that takes an instance of a Flask
application and registers all your blueprints on it in one go. Something like this:
# 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
Alternately, you could use something like HipPocket
's autoload
function (full disclosure: I wrote HipPocket
) to simplify the import handling:
# 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")
However, as it currently stands you couldn't use the same structure as example #1 (HipPocket assumes you are using packages for each Blueprint). Instead, your layout would look like this:
# 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 前缀等等 :)
当然你也可以在你的主蓝图中做这样的事情,所以在创建应用程序时你需要注册那个主蓝图。