2012-07-13 117 views
21

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

我想不同模块之间被分割我的应用程序,但它看起来像它很难从其他地方比主模块进入主app对象(或dbflask-sqlalchemy)。看起来你必须真正写出你自己的方式来把它看作是一切都可以访问的全局,这需要一些有问题的代码和一些时间。

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

同样的事情发生在db - 我不知道我是否应该坚持到g,或通过app以某种方式访问​​它。这样做并不能帮助我将模型移动到单独的模块中,但是如何在导入模型时访问db?所有示例再次假定它只是作为局部变量提供。

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

+0

装饰器只是功能包装。您可以创建一个封装所有服务器逻辑的类,并将类中的所有'db'和'app'变量存储在该类中。 – Blender 2012-07-13 00:12:50

+0

@Blender当然,有很多方法可以手工解决这个问题。我真正想知道的是,如果有任何标准的方式来处理它,并且如果它似乎完全从文档中丢失,那么还有没有更多的惊喜。我期待从瓶子本身出现某种更明显的解决方案。 – viraptor 2012-07-13 00:19:51

+0

您可以使用Blueprint – user956424 2013-06-24 07:33:53

回答

19

你的问题的答案是蓝图。事实上,如果你看看文档,就会提到蓝图有助于在模块中分割应用程序。

样品的编号:

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是指导如何烧瓶应用分成由烧瓶的创造者大项目模块。

+0

非常不错的文档链接! ;) – 2012-08-15 19:41:51

+1

@IgnasB。谢谢!看看这个回购github与基本的大型烧瓶应用程序结构由我https://github.com/codecool/flask-app-structure – codecool 2012-08-16 11:14:06

+0

会看看! ;) – 2012-08-16 14:47:50

2

你见过新blueprintsfeature(我没有使用过,但听起来像这样可以你的情况有帮助)。

相关问题