56

我正在使用烧瓶并尝试以下操作。

我已经定义了一个 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 对象并在所有类之间共享呢?

谢谢,穆尔塔萨

4

6 回答 6

94

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

from flask import current_app as app

def home():
    return render_template('base.html', name=app.name)
于 2015-07-07T21:02:41.703 回答
27

首先,我建议看一下 Blueprints http://flask.pocoo.org/docs/blueprints/这将有助于轻松组织应用程序。

另请查看http://flask.pocoo.org/docs/api/#flask.current_app flask.current_app,如何在其他模块中获取您的应用程序实例。

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

玩得开心 :)

于 2012-11-08T09:34:18.927 回答
20

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

myapplication/
    *        __init__.py
    *        myviews/
        *         __init__.py
        *         view.py
        *         tags.py

ETC

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

app = Flask(__name__)

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

import myapplication.myviews.view
于 2012-11-08T15:13:55.213 回答
13

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

例如,您的 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

只要您在创建应用程序之后放置导入,就像上面一样,循环导入就不应该有问题。

于 2012-11-08T09:12:25.307 回答
4

关于在单独的源文件中的“帮助”python 函数中从烧瓶导入和使用 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(...)

助手.py:

from flask import current_app as app
...
def dbopen():
    app.logger.info(...)
    ...
于 2016-08-17T19:37:07.830 回答
1

如果你有一个AppName.py定义的文件app,然后你有另一个Foobar.py需要它的文件,你总是可以说 in AppName.py

import Foobar
Foobar.app = app

然后,Foobar.py您应该能够在您的功能中使用应用程序。您需要注意的一件事是,Foobar.py当文件被调用时,您不能在其中立即运行代码,这取决于app导入后传入的变量。

于 2013-05-21T15:42:06.710 回答