6

我有一系列正在使用的蓝图,我希望能够将它们进一步捆绑到一个包中,我可以尽可能无缝地与任何数量的其他应用程序一起使用。为应用程序提供整个引擎的一组蓝图。我有点创建了自己的解决方案,但它是手动的,需要付出太多努力才能有效。它看起来不像是一个扩展,它不仅仅是一个蓝图(几个提供通用功能的蓝图)。

这完成了吗?如何?

(将几个程序捆绑在一起的应用程序调度方法可能不是我想要的)

4

4 回答 4

3

我希望 Blueprint 对象有一个 register_blueprint 函数,就像 Flask 对象一样。它会自动在当前蓝图的 url 下放置和注册蓝图。

于 2014-06-14T02:40:44.870 回答
3

看看这个:嵌套蓝图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)
于 2021-06-01T16:26:11.737 回答
2

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
于 2012-09-22T03:06:52.980 回答
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 前缀等等 :)

当然你也可以在你的主蓝图中做这样的事情,所以在创建应用程序时你需要注册那个主蓝图。

于 2012-09-22T06:59:45.807 回答