我正在尝试编写一个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。
答案 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?"。