我正在使用 Flask 构建一个网络服务器,我需要能够更改特定用户的会话变量。为此,我创建了一个变量 (
foo
),在其中存储会话变量中需要更改的数据。我还使用 app.before_request
装饰器创建了一个函数,这就是我检查 foo
的地方,以查看当前 session variable
foo = {}
@app.route("/admin", methods=["GET","POST"])
def some_admin_route():
...
foo[username] = {'key': 'value'}
@app.before_request
def before_request_func():
if session['username'] in foo:
for key in foo:
session[key] = foo[key]
这在我的本地 PC 上完美运行,但是当在我的 VPS(使用 uwsgi)上测试时,奇怪的事情发生了。如果我刷新多次,有时
foo
变量为空,有时不是,当有两个键/值对时,有时两个都在变量中,有时只有一个,有时两者都没有。global foo
但没有任何改变。
我找到了使用 Redis 的解决方案。这是一个基本示例,它使用
hset
存储数据,hexists
检查 username
是否存在,使用 hget
检索数据。
redis = Redis(host='localhost', port=6379, db=0)
@app.route("/admin", methods=["GET","POST"])
def some_admin_route():
...
redis.hset("foo", username, json.dumps({'key': 'value'}))
@app.before_request
def before_request_func():
if redis.hexists("foo", session[username]):
bar = json.loads(redis.hget("foo", session[username]))
for key in bar:
session[key] = bar[key]
redis.hdel("foo", session[username])