烧瓶,从app.route内部重新读取YAML超出app.route范围

时间:2019-06-24 16:12:57

标签: python flask

我正在尝试编写一个Flask应用程序,该应用程序从光盘读取prefs文件,并且还允许该文件的向下和上载。

但是在上传后,在应用程序内部重新加载文件会导致问题。

我正在执行以下操作时,在程序启动时加载正常:

prefsfile=os.path.join(app.config['UPLOAD_FOLDER'], 'foo.yaml')

def read_prefs():
    with open(prefsfile, 'r') as file:
        p=yaml.safe_load(file)
    return p

prefs=read_prefs()

然后我有一些app.routes可以像这样访问prefs对象,

@app.route('/foo')
def foo():
    items=prefs['foo']['items']
    messages=prefs['messages']
    return render_template(
        'foo.html',
        items = items,
        messages = messages
    )

然后我从app.route内部更改对象,并将其也保存到光盘中。

def save_prefs():
    with open(prefsfile, 'w') as file:
        yaml.dump(prefs, file)

@app.route('/foo/del_item', methods = ['POST'])
def foo_del_item():
    prefs['foo']['items'].pop(request.form['item_id'])
    save_prefs()
    return redirect(url_for('foo'))

但是,当我从表单上传文件时,然后我不知道如何在app.route外部重新加载prefs = read_prefs()以使其可用于所有其他路由。

...
   file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
...

我尝试过:

@app.route('/reload_foo')
def reload_foo():
    prefs = read_prefs()

    return redirect(url_for('foo'))

但这仅在app.route内部有效,不适用于所有这些人。

目标是将prefs = read_prefs()重新加载到app.route外部,以使其可用于所有其他app.routes。

1 个答案:

答案 0 :(得分:0)

全局变量,即使与下面显示的语法一起使用,也无法在Flask中按预期工作,因为多个请求可能会尝试同时修改它们。有关在Web应用程序中处理全局数据的正确方法,请参见Are global variables thread safe in flask? How do I share data between requests?


prefs是全局变量。如果要在函数中更改它,则需要使用global关键字:

@app.route('/reload_foo')
def reload_foo():
    global prefs
    prefs = read_prefs()
    return redirect(url_for('foo'))

请参阅文档中的"What are the rules for local and global variables in Python?"