Python can';t在烧瓶中启动应用程序之前初始化值

Python can';t在烧瓶中启动应用程序之前初始化值,python,flask,Python,Flask,我正在玩一点Flask,对于我的应用程序,我需要一个全局存储,它由服务器后台运行的线程更新。我发现了关于全局上下文的问题,如果我显式使用/create初始化服务器,Johan Gov的答案似乎有效: from flask import Flask from flask.json import jsonify app = Flask(__name__) cache = {} @app.route("/create") def create(): cache['foo

我正在玩一点Flask,对于我的应用程序,我需要一个全局存储,它由服务器后台运行的线程更新。我发现了关于全局上下文的问题,如果我显式使用/create初始化服务器,Johan Gov的答案似乎有效:

from flask import Flask
from flask.json import jsonify
app = Flask(__name__)

cache = {}

@app.route("/create")
def create():
    cache['foo'] = 0
    return jsonify(cache['foo'])

@app.route("/increment")
def increment():
    cache['foo'] = cache['foo'] + 1
    return jsonify(cache['foo'])

@app.route("/read")
def read():
    return jsonify(cache['foo'])

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

但是,如果我尝试自动调用init,它会失败,因为显然没有已知的
缓存[“foo”]

from flask import Flask
from flask.json import jsonify
app = Flask(__name__)

cache = {}

def create():        #create does not have a route anymore
    cache['foo'] = 0

@app.route("/increment")
def increment():
    cache['foo'] = cache['foo'] + 1
    return jsonify(cache['foo'])

@app.route("/read")
def read():
    return jsonify(cache['foo'])

if __name__ == '__main__':
    create()    #initialize by default
    app.run()


为什么会这样?如何在启动应用程序之前初始化全局状态?

tbh,上面的代码对我来说没有任何更改,我能够读取并递增计数器

使用
global
变量尝试下面的代码

from flask import Flask
from flask.json import jsonify

app = Flask(__name__)

cache = {}


def create():  # create does not have a route anymore
    global cache
    cache['foo'] = 0


@app.route("/increment")
def increment():
    global cache
    cache['foo'] = cache['foo'] + 1
    return jsonify(cache['foo'])


@app.route("/read")
def read():
    return jsonify(cache['foo'])


if __name__ == '__main__':
    create()  # initialize by default
    app.run()

您可以将缓存用作应用程序属性,我总是在希望避免尴尬的全局定义时使用此属性,只需如下定义缓存:

#这里为应用程序创建一个“缓存”属性。
app.cache={}
app.cache['foo']=0
#然后,在呼叫路线时:
#请注意,我们不需要全局关键字,因为我们正在使用应用程序。
@应用路线(“/增量”)
def增量():
app.cache=app.cache+1
返回jsonify(app.cache)

我甚至使用了相对较大的对象,如使用此方法的深度学习模型,并且没有任何问题。

谢谢您的回复。这个解决方案是正确的,非常感谢。但里面有个打字错误。所有出现的app['cache']应该是app.cache imo。也许你可以纠正这一点,我也可以接受你的回答。实际上我的意思是app.config['cache'],但是,dot方法(app.cache)看起来更干净,所以我已经更改了。谢谢你的回复。不幸的是,无论是否有“全局”关键字,它都无法工作。然而,KiLJ4deN提供的上述解决方案对我有效