蓝图蓝图(烧瓶)

时间:2012-09-21 15:40:46

标签: python web-services web-applications flask blueprint

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

这样做了吗?怎么样?

(捆绑几个程序的应用程序调度方法可能不起作用)

4 个答案:

答案 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

或者,您可以使用类似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

答案 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)
相关问题