我想在用户登录时显示注销按钮,在用户注销时显示登录按钮。但是这些按钮显示的次数与我有用户的次数一样多。我该如何修复它?
--html code
{% for user in users %}
{% if user.user_id == session['user_id'] %}
<li class="nav-item">
<a class="nav-link js-scroll-trigger" href="/logout">Logout </a>
</li>
{% elif user.user_id != session['user_id'] %}
<li class="nav-item">
<a class="nav-link js-scroll-trigger" href="/login_register">Login </a>
</li>
{% endif %}
{% endfor %}
--server.py code
@app.route('/')
def landing():
mysql = connectToMySQL('comfort_zone')
query = "Select user_id from users"
users = mysql.query_db(query)
return render_template('index.html',users=users)
遇到的问题是,在 users 列表中的 每个用户 上循环,而不是只检查一次当前用户是否已登录。
以下是在 Flask 和 Jinja2 模板中仅显示一个登录或注销按钮的方法:
1. 简化路由函数:
from flask import session
@app.route('/')
def landing():
return render_template('index.html')
不需要从数据库中获取所有用户,只需要知道当前是否有用户登录即可。Flask 的
session
对象可以帮助做到这一点。
2. 更新 Jinja2 模板:
{% if 'user_id' in session %}
<li class="nav-item">
<a class="nav-link js-scroll-trigger" href="/logout">Logout </a>
</li>
{% else %}
<li class="nav-item">
<a class="nav-link js-scroll-trigger" href="/login_register">Login </a>
</li>
{% endif %}
这里我们直接在模板中检查
session
中是否存在
user_id
。如果存在,则说明用户已登录,显示“注销”按钮;否则显示“登录”按钮。
解释:
-
'user_id' in session
: 这行代码检查当前 session 中是否存在名为user_id
的键。如果用户已登录,通常会在登录过程中将user_id
存储在 session 中。 -
{% if ... %}{% else %}{% endif %}
: 这是 Jinja2 的条件语句,用于根据条件显示不同的内容。
其他建议:
-
登录逻辑:
确保的登录路由 (
/login_register
) 在成功登录后将user_id
存储到 session 中:session['user_id'] = user.id
。 -
注销逻辑:
确保的注销路由 (
/logout
) 清除 session 中的user_id
:session.pop('user_id', None)
。
通过以上修改,将能够在 Flask 和 Jinja2 模板中正确地显示登录或注销按钮,而不会出现重复显示的问题。
标签:python,html,flask,jinja2 From: 60477757