4

如何从我的配置中注册 Flask 蓝图,例如 Django 中的应用程序?

我想在配置文件中定义蓝图,会自动注册

#config.py
BLUEPRINTS = (
'news',
'files',
)
4

2 回答 2

2

实际上,我一直在一个暂定名为Hip Pocket的项目中勾勒出类似的东西。它与@HighCat 给你的答案基本相同,除了它使用 Python 的打包系统而不是config.py文件(尽管它可以扩展为从配置文件自动加载 -问题拉取请求是最受欢迎的。)

所以在 Hip Pocket 你会这样做(看看hip_pocket.tasks它是如何工作的):

from flask import Flask
from hip_pocket.tasks import autoload

app = Flask(__name__)
autoload(app)

autoload遍历一个包(默认名为“apps”,尽管您可以通过传入关键字 arg 来更改它apps_package)寻找要flask.Blueprint在应用程序上注册的对象(默认情况下,它会查找在它找到的每个子包中命名routes的模块中命名的符号routes但这些默认值也可以更改。)您的文件夹布局可能如下所示:

+ you_app
. . . . __init__.py
. . . . app.py
. . . . + apps
        . . . . __init__.py
        . . . . routes.py # contains the declaration `routes = Blueprint(...)`
        . . . . + news
                . . . . __init__.py
                . . . . routes.py     # Ditto
                . . . . some_module.py
        . . . . + files
                . . . . __init__.py
                . . . . routes.py     # Ditto
                . . . . # etc.

或者,如果你想使用基于配置的加载器,你可以这样做:

 from flask import Flask
 from werkzeug.utils import import_string

 app = Flask(__name__)
 app.config.from_object("your_app.config")

 for tool_path in app.config["BLUEPRINTS"]:
     tool = import_string(tool_path)
     app.register_blueprint(tool)
于 2012-07-26T02:54:12.027 回答
1

Flask 不是 Django,它没有这些特性。如果你真的需要这个,你可以尝试自己实现这个行为:

假设您有中央 Flask 应用程序文件,其中包含:

import flask
app = flask.Flask(__name__)
  1. 将您的 BLUEPRINTS 变量放入烧瓶的配置(您使用 app.config.from_pyfile(...) 注册的那个),因此可以通过 app.config['BLUEPRINTS'] 访问它
  2. 在您的中央应用程序文件中(您在其中执行 app=flask.Flask(__name__)),只需遍历 app.config['BLUEPRINTS'],尝试从它们可以存在的地方导入它们,然后使用 app.register_blueprint 注册它们()。
于 2012-07-25T09:08:08.377 回答