如何在烧瓶中共享全局app对象?

时间:2012-11-08 08:02:11

标签: python flask

我正在使用烧瓶并尝试以下方法。

我已经定义了一个main.py文件,通过它我想运行我的应用程序,即python main.py -

from flask import Flask
from view import tags

app = Flask(__name__)

@app.route('/')
def hello_world():
    return 'Hello World!'

if __name__ == '__main__':
    app.run()

我已经定义了一个名为view的包,我将在其中声明我的不同视图模块,每个模块都有自己的路由。 view.tags.py -

from flask import Flask
app = Flask(__name__)

@app.route('/e')
def hello_world2():
    return 'Hello World!'

所以我需要在main.py中使用全局app对象来运行服务器,以及在我的包的视图类中注册路由。那么如何创建全局app对象并在所有类之间共享呢?

谢谢, 穆尔塔扎

6 个答案:

答案 0 :(得分:36)

您可以从flask导入current_app。它存储对全局应用程序对象的引用。

from flask import current_app as app

def home():
    return render_template('base.html', name=app.name)

答案 1 :(得分:18)

首先,我建议您查看蓝图http://flask.pocoo.org/docs/blueprints/这有助于轻松整理应用。

另请参阅http://flask.pocoo.org/docs/api/#flask.current_app flask.current_app,了解如何在其他模块中获取应用实例。

这个链接也可能对如何组织和构建烧瓶应用程序有所帮​​助(这不是理想的,但可以给你一些想法) - Large-app-how-to.md

玩得开心:)

答案 2 :(得分:10)

一种方法是创建一个整体包,并在声明所有全局变量的地方添加__init__.py文件。例如,在您的情况下,您可以创建类似:

的内容
myapplication/
    *        __init__.py
    *        myviews/
        *         __init__.py
        *         view.py
        *         tags.py

现在,您在__init__.py文件中添加以下代码:

app = Flask(__name__)

现在,只要导入包myapplication,就可以在任何地方使用此app变量。

import myapplication.myviews.view

答案 3 :(得分:9)

只需从其他文件中导入即可。也许最好的方法是将您的app对象放在一个文件中,并从中导入其他所有内容。

例如,您的main.py仍然可以:

from flask import Flask
from view import tags

app = Flask(__name__)

然后在其他文件中,你可以这样做:

from .main import app

或者,如果在您的包裹之外,只需使用完整的字符串

from mypackagename.main import app

需要注意的一点是循环进口。处理此问题的最简单方法是首先创建您的应用程序,然后在创建之后从基础文件中导入您需要的任何其他内容。

例如:

from flask import Flask
app = Flask(__name__)

# do some stuff with app
from .views import view1, view2
from .server import run

只要你在之后放置你已经创建了app,就像上面那样,你就不会有循环导入的问题。

答案 4 :(得分:1)

关于在单独的源文件中的“helper”python函数中从flask中导入和使用current_app,只要已经设置了当前的应用程序上下文(例如,收到Web请求),这就可以工作。我有一个案例,在应用程序初始化期间(app.run尚未调用),在辅助函数中调用app.logger。

在我修复它之前(见下文),我得到了一个堆栈跟踪,标点为“RuntimeError:在应用程序上下文之外工作”。

示例解决方案:
main.py:

import helper
...
app = Flask(__name__.split('.')[0],
        template_folder="templates",
        static_folder="static")
... 
# Fix: Create an app context
with app.app_context():
    helper.dbopen(...)
...
app.run(...)

helper.py:

from flask import current_app as app
...
def dbopen():
    app.logger.info(...)
    ...

答案 5 :(得分:0)

如果您有一个文件AppName.py,其中您定义了app,然后您有另一个需要它的文件Foobar.py,您可以随时在AppName.py中说:< / p>

import Foobar
Foobar.app = app

然后在Foobar.py中,你应该可以在你的功能中使用app。您要注意的一件事是,在调用文件时,您不能在Foobar.py中立即运行代码取决于导入后传入的app变量。