我正在使用烧瓶并尝试以下方法。
我已经定义了一个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对象并在所有类之间共享呢?
谢谢, 穆尔塔扎
答案 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
变量。