如何在Django中从类似配置的应用程序中注册Flask Blueprint?
我想在配置文件中定义蓝图,它将自动注册
#config.py
BLUEPRINTS = (
'news',
'files',
)
实际上,我在一个暂定名为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)
Flask不是Django,它没有这样的特性。如果你真的需要,你可以尝试自己实现这种行为:
假设您有中央烧瓶应用程序文件,其中包含:
import flask
app = flask.Flask(__name__)
- 将您的BLUEPRINTS变量放入flask的配置(您在app.config.from_file[…]中注册的那个),这样它就可以通过app.config['BLUEPRINTS']访问
- 在您的中央应用程序文件中(您在其中执行app=flaks.flask(__name__)),只需迭代app.config['BLUEPRINTS'],尝试从它们所在的位置导入它们,并用app.register_blueprint()注册它们