烧瓶应用的结构

时间:2012-07-13 00:03:11

标签: python flask flask-sqlalchemy

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

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

flask-sqlalchemyapp都是在实例化主应用程序的级别创建的,并且每个示例都假定它们在顶层可用。但是如果我将不同的url处理程序拆分为不同的模块,我就失去了使用db装饰器的能力。我可以使用@app.route解决这个问题,但是再次,app不会传递给该函数。

同样的事情发生在app.add_url_rule('/...', some.module...) - 我不知道是否应该将其粘贴到db中,或者以某种方式通过g访问它。这样做并没有帮助我将模型移动到一个单独的模块中 - 在导入模型时我应该如何访问app?所有示例再次假设它只是作为局部变量使用。

我是否遗漏了一些明显的东西,或者我是否正在尝试使用烧瓶来完成错误的任务?

2 个答案:

答案 0 :(得分:20)

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

示例代码:

    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

查看此document,其中指导了如何将烧瓶应用程序划分为烧瓶创建者的大型项目模块。

答案 1 :(得分:2)

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