Flask 中不一致的全局变量
Inconsistent globals in Flask
我有一个菜单,用户可以根据他们的权限看到不同的菜单项。我在登录时检查用户是否有选项,将其存储在全局变量中,并在呈现菜单时检查该变量。
在生产中,菜单仅在大约 50% 的时间内正确显示。有时该值已设置,有时为空。为什么这不能正常工作?
@app.route('/login/', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
user = User.get(request.form['username'])
if user.user is None:
return redirect('/login/')
if user and check_password_hash(user.user.password, request.form['password']):
login_user(user)
if isinstance(current_user.user, UserTypeOne):
group = UserGroup.query.filter_by(id=int(current_user.user.group)).first()
app.jinja_env.globals['group_access_to_feature_one'] = group.group_access_to_feature_one
return redirect(request.args.get('next') or url_for('index'))
return redirect(url_for('login'))
header
模板有条件检查该值:
{% if group_access_to_feature_one%}<ul>...</ul>{%endif%}
调试的时候放{{ group_access_to_feature_one }}
看值,有时候是True
有时候是空
在生产中(有时可能在开发中),您是 运行 多个进程。每个进程都会创建自己的应用程序副本,因此只有处理登录请求的进程中的应用程序才能看到对环境的更改。这是不鼓励使用 Python 全局变量存储状态的主要原因之一。 app.jinja_env.globals
仅在设置期间进行修改,以便每个 process/thread 保持一致。
使用数据库或其他存储(例如 Redis)来存储和访问全局状态。使用 session
存储有关特定浏览器会话的信息,例如登录用户。使用 app.before_request
回调为每个用户加载每个请求的状态。
您的代码也不正确,因为每次用户登录时都会更改全局 Flask 环境。因此 every 用户的值将基于 last 用户登录并设置值。
我有一个菜单,用户可以根据他们的权限看到不同的菜单项。我在登录时检查用户是否有选项,将其存储在全局变量中,并在呈现菜单时检查该变量。
在生产中,菜单仅在大约 50% 的时间内正确显示。有时该值已设置,有时为空。为什么这不能正常工作?
@app.route('/login/', methods=['GET', 'POST'])
def login():
if request.method == 'POST':
user = User.get(request.form['username'])
if user.user is None:
return redirect('/login/')
if user and check_password_hash(user.user.password, request.form['password']):
login_user(user)
if isinstance(current_user.user, UserTypeOne):
group = UserGroup.query.filter_by(id=int(current_user.user.group)).first()
app.jinja_env.globals['group_access_to_feature_one'] = group.group_access_to_feature_one
return redirect(request.args.get('next') or url_for('index'))
return redirect(url_for('login'))
header
模板有条件检查该值:
{% if group_access_to_feature_one%}<ul>...</ul>{%endif%}
调试的时候放{{ group_access_to_feature_one }}
看值,有时候是True
有时候是空
在生产中(有时可能在开发中),您是 运行 多个进程。每个进程都会创建自己的应用程序副本,因此只有处理登录请求的进程中的应用程序才能看到对环境的更改。这是不鼓励使用 Python 全局变量存储状态的主要原因之一。 app.jinja_env.globals
仅在设置期间进行修改,以便每个 process/thread 保持一致。
使用数据库或其他存储(例如 Redis)来存储和访问全局状态。使用 session
存储有关特定浏览器会话的信息,例如登录用户。使用 app.before_request
回调为每个用户加载每个请求的状态。
您的代码也不正确,因为每次用户登录时都会更改全局 Flask 环境。因此 every 用户的值将基于 last 用户登录并设置值。