烧瓶应用的结构

vir*_*tor 22 python flask flask-sqlalchemy

我正在尝试使用Flask创建一个简单但非常简单的应用程序,并且我一直遇到文档中没有解释的情况.

我希望我的应用程序可以在不同的模块之间拆分,但看起来很难从主模块以外的任何其他地方访问主app对象(或db来自flask-sqlalchemy).看起来你必须真正编写自己的方式将它视为一切都可以访问的全局,这需要一些有问题的代码和一些时间.

双方appdb在那里的主要应用实例,每个实例假定他们可以在顶级水平的创建.但是如果我将不同的url处理程序拆分成不同的模块,我就失去了使用@app.route装饰器的能力.我可以解决这个问题app.add_url_rule('/...', some.module...),但是再次,app不会传递给该函数.

同样的事情发生在db- 我不知道我是应该坚持下去g,还是通过app某种方式让它可以访问.这样做并没有帮助我将模型移动到一个单独的模块中 - db导入它时我应该如何访问?所有示例再次假设它仅作为局部变量可用.

我错过了一些明显的东西,还是我想在这里使用烧瓶来完成错误的任务?

cod*_*ool 21

你的问题的答案是蓝图.实际上,如果你看一下文档,就会提到蓝图可以在模块中实现应用程序的划分.

示例代码:

    from flask import Blueprint

    mod = Blueprint(blueprint_name, __name__, template_folder="folder_name"
                    static_folder="folder_name")

    @mod.route('/mymodule')
    def view():
         # your code
Run Code Online (Sandbox Code Playgroud)

在app.py中

    from yourmodule import mod 

    app.register_blueprint(mod)
Run Code Online (Sandbox Code Playgroud)

这是将应用程序划分为模块的正确方法.查看蓝图文档以获取更多详细信息.

此外,如果您需要访问任何其他模块current_app中的应用程序,则应使用该应用程序的代理.

    from flask import current_app
Run Code Online (Sandbox Code Playgroud)

查看此文档,该文档指导如何将烧瓶应用程序划分为烧瓶创建者的大型项目模块.

  • 这并没有真正解释如何以可重用的方式配置您的蓝图中的模型,因为它们(如果使用Flask-SQLAlchemy)依赖于`db`对象(您必须以某种方式导入). (6认同)