Python 烧瓶应用的结构

Python 烧瓶应用的结构,python,flask,flask-sqlalchemy,Python,Flask,Flask Sqlalchemy,我试图用Flask创建一个简单但不平凡的应用程序,但我一直遇到文档中没有很好解释的情况 我希望我的应用程序在不同的模块之间进行拆分,但似乎很难从主模块以外的任何其他位置访问主应用程序对象(或数据库)。看起来,你必须真正以自己的方式将其视为所有人都可以访问的全局文件,这需要一些有问题的代码和一点时间 app和db都是在实例化主应用程序的级别创建的,每个示例都假设它们在顶层可用。但是,如果我将不同的url处理程序拆分为不同的模块,我将失去使用@app.route装饰器的能力。我可以用app.add_

我试图用Flask创建一个简单但不平凡的应用程序,但我一直遇到文档中没有很好解释的情况

我希望我的应用程序在不同的模块之间进行拆分,但似乎很难从主模块以外的任何其他位置访问主
应用程序
对象(或
数据库
)。看起来,你必须真正以自己的方式将其视为所有人都可以访问的全局文件,这需要一些有问题的代码和一点时间

app
db
都是在实例化主应用程序的级别创建的,每个示例都假设它们在顶层可用。但是,如果我将不同的url处理程序拆分为不同的模块,我将失去使用
@app.route
装饰器的能力。我可以用app.add_url_rule(“/…”,some.module…解决这个问题,但同样,app不会传递给该函数

同样的事情也发生在
db
上——我不知道是应该把它粘贴到
g
,还是通过
app
来访问它。但是,这样做无助于我将模型移动到单独的模块中——导入模型时,我应该如何访问
db
?所有的例子都假设它只是一个局部变量


我是否遗漏了一些明显的东西,或者我试图使用flask执行错误的任务?

您是否看到了新的
蓝图(我还没有使用它,但听起来这可能对您的情况有所帮助)。

您问题的答案是蓝图。事实上,如果您查看文档,就会发现蓝图是用来在模块中划分应用程序的

示例代码:

    from flask import Blueprint

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

    @mod.route('/mymodule')
    def view():
         # your code
在app.py中

    from yourmodule import mod 

    app.register_blueprint(mod)
这是将应用程序划分为模块的正确方法。查看蓝图文档了解更多详细信息

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

    from flask import current_app

查看这篇文章,它指导了flask的创建者如何将flask应用程序划分为大型项目的模块。

装饰器只是功能包装器。您可以创建一个封装所有服务器逻辑的类,并在该类中存储所有
db
app
变量。@Blender当然,有很多方法可以手动解决这个问题。我真正想知道的是,是否有任何标准的方法来处理它,如果它似乎完全从文档中丢失,是否还有更多的惊喜。我期待着从烧瓶本身的某个地方得到一些更明显的解决方案。你可以使用蓝图(可能是非常好的文档链接的副本!)@伊格纳斯布。谢谢我在github上用基本的大烧瓶应用程序结构查看了这个repo。这并没有真正解释如何以可重用的方式在蓝图中配置模型,因为它们(如果使用烧瓶SQLAlchemy)依赖于
db
对象(您必须以某种方式导入)。