提问者:小点点

将变量附加到应用程序是否与烧瓶中的current_app相同?[重复]


类似于这个问题,我想在整个Flask应用程序(所有请求)中共享一个变量。

我正在编译一个大数据文件(相当大的开销),并希望尽可能少地进行编译—将结果存储在一个变量中,以便以后可以访问它。使用烧瓶。g无法工作,因为它在请求之间被清除。

六年前,在Reddit的一篇帖子中,Armin Ronacher(Flask的创建者)说:

您可以将它附加到应用程序对象,并通过flask.current_app.whatever_variable访问它。

以下是我的两个问题:

A) 这仍然是推荐的做法吗?

b)这两种方法(附加到current_app或应用程序工厂内的app)是否等价?

使用当前应用程序:

from flask import current_app
current_app.my_var = <<file>>

使用应用程序工厂:

def create_app(config_filename):
    app = Flask(__name__)
    app.config.from_pyfile(config_filename)
    app.my_var = <<file>>
    ...
    return app

共1个答案

匿名用户

通常在我的项目中,我创建一个Globals.py在我的程序的每一部分使用全局变量,像这样:

from celery import Celery
from flask_babel import Babel
from flask_marshmallow import Marshmallow
from flask_socketio import SocketIO
from flask import json, Flask

app: Flask = None
marshmallow: Marshmallow = Marshmallow()
socket = SocketIO(async_mode="eventlet", json=json)
celery: Celery
babel = Babel()
current_user = None


def init_globals(currentApp):
    global marshmallow
    global app
    global socket
    global celery
    global babel
    app = currentApp
    marshmallow.init_app(app)
    babel.init_app(app)
    socket.init_app(app)

    celery = Celery(app.name, broker=app.config['CELERY_BROKER_URL'])
    celery.conf.update(app.config)

主要是这样做。派克

import Globals
app = Flask(__name__)
Globals.init_globals(app)