【问题标题】:blueprint of blueprints (Flask)蓝图的蓝图(Flask)
【发布时间】:2012-09-14 01:35:07
【问题描述】:

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

完成了吗?怎么样?

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

【问题讨论】:

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


【解决方案1】:

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

【讨论】:

  • 没有解决办法吗?即使在 8 年后???
【解决方案2】:

检查一下:嵌套蓝图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)

【讨论】:

  • 2.0 是一个非常棒的版本,感谢您指出这一点!
【解决方案3】:

最简单的方法是创建一个函数,该函数接受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

【讨论】:

    【解决方案4】:

    我有自己的解决方案如何加载配置中定义的蓝图,因此您可以在配置中使用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 前缀等等 :)

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

    【讨论】:

      猜你喜欢
      • 2021-10-04
      • 2017-05-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-26
      • 1970-01-01
      相关资源
      最近更新 更多