Flask应用程序的结构

22

我试图使用 Flask 创建一个简单但不琐碎的应用程序,但在文档中没有很好地解释的情况下一直遇到问题。

我希望我的应用程序分为不同的模块,但看起来很难从除了主模块以外的任何其他地方访问主要的 app 对象(或者 flask-sqlalchemy 中的 db)。似乎您必须真正编写自己的方法将其视为所有内容都可以访问的全局变量,这需要一些可疑的代码和一点时间。

无论是 app 还是 db 都是在实例化主应用程序的级别创建的,每个示例都假定它们在顶层可用。但如果我将不同的 URL 处理程序拆分到不同的模块中,我就失去了使用 @app.route 装饰器的能力。我可以通过 app.add_url_rule('/...', some.module...) 解决这个问题,但再一次,app 没有传递到该函数。

db 也有同样的问题 - 我不知道是否应该将其放入 g,或者以某种方式通过 app 访问它。这样做对我把模型移到单独的模块中没有帮助 - 当导入它们时,我该如何访问 db?所有示例都假定它只是作为局部变量可用。

我是否遗漏了一些明显的东西,或者我在这里尝试使用 Flask 的错误任务?


装饰器只是函数包装器。您可以创建一个类来封装所有服务器逻辑,并将所有dbapp变量存储在类内部。 - Blender
@Blender 当然,有很多方法可以手动解决这个问题。我真正想知道的是是否有任何标准方法来处理它,如果它似乎完全缺少文档,那么还有什么更多的惊喜等着我们。我期望从flask本身提供的某个地方呈现出更明显的解决方案。 - viraptor
你可以使用蓝图。 - user956424
2个回答

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

在app.py中

    from yourmodule import mod 

    app.register_blueprint(mod)

这是将应用程序分成模块的正确方法。查看蓝图文档以获取更多细节。

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

    from flask import current_app

看看这个文档,它由flask的创作者编写,指导如何将flask应用程序分成模块以适应大项目。


非常好的文档链接!;) - Ignas Butėnas
1
@IgnasB。谢谢!请查看我在Github上的基本大型Flask应用程序结构存储库https://github.com/codecool/flask-app-structure - codecool
6
这并没有真正解释如何以可重用的方式在您的蓝图中配置模型,因为它们(如果使用Flask-SQLAlchemy)依赖于db对象(您必须以某种方式进行导入)。 - vicvicvic

2

你看过新的 蓝图 功能 吗?(我还没有使用过,但听起来这可能对你有帮助)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接