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

mur*_*a52 31 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()
Run Code Online (Sandbox Code Playgroud)

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

from flask import Flask
app = Flask(__name__)

@app.route('/e')
def hello_world2():
    return 'Hello World!'
Run Code Online (Sandbox Code Playgroud)

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

谢谢,穆尔塔扎

小智 49

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

from flask import current_app as app

def home():
    return render_template('base.html', name=app.name)
Run Code Online (Sandbox Code Playgroud)

  • 为什么我使用`Admin(current_app,name ='admin',template_mode ='bootstrap3')运行Flask-Admin```在应用程序上下文之外工作. (6认同)
  • 这是一个很棒的简单答案,我希望我很久以前就遇到过。这对于避免扭曲大脑以考虑加载视图的顺序、创建应用程序的方式和位置等很有用。 (4认同)
  • 重要的!这里描述了一个缺失的部分:https://flask.palletsprojects.com/en/2.1.x/appcontext/ 它需要为初始化依赖于模块顶层应用程序对象的模块提供上下文,如下所示:应用程序上下文():init_db() (3认同)

Ign*_*nas 22

首先,我建议您查看蓝图http://flask.pocoo.org/docs/blueprints/这将有助于轻松组织应用程序.

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

这个链接也可能有助于如何组织和构建烧瓶应用程序(这不是理想的,但可以给你一些想法)https://github.com/mitsuhiko/flask/wiki/Large-app-how-to

玩得开心 :)

  • +1 蓝​​图是使用纯 Flask 执行此操作的正确方法。 (2认同)

Jef*_*ner 11

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

例如,您的main.py可能仍然具有:

from flask import Flask
from view import tags

app = Flask(__name__)
Run Code Online (Sandbox Code Playgroud)

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

from .main import app
Run Code Online (Sandbox Code Playgroud)

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

from mypackagename.main import app
Run Code Online (Sandbox Code Playgroud)

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

例如:

from flask import Flask
app = Flask(__name__)

# do some stuff with app
from .views import view1, view2
from .server import run
Run Code Online (Sandbox Code Playgroud)

只要你在创建应用程序之后放入导入,就像上面那样,你就不应该有循环导入的问题了.

  • 如果app在`create_app`之类的方法中,我该如何导入它?`create_app`会再次创建其他应用程序对象吗?我看到很多使用create_app函数的例子 (4认同)

cod*_*eek 11

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

myapplication/
    *        __init__.py
    *        myviews/
        *         __init__.py
        *         view.py
        *         tags.py
Run Code Online (Sandbox Code Playgroud)

等等

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

app = Flask(__name__)
Run Code Online (Sandbox Code Playgroud)

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

import myapplication.myviews.view
Run Code Online (Sandbox Code Playgroud)