Jinja2如何导入全局变量实现所有页面显示登录用户名
问题原因
你当前仅在/dashboard路由的渲染逻辑中传递了name变量,其余路由没有传递该变量,因此继承了layout.html的其他页面渲染时无法读取到name值,导致用户名只在仪表盘页面显示。
你使用的Flask-Login插件默认已经将current_user对象注入到所有Jinja2模板的全局上下文中,不需要单独通过路由传递变量就可以在任意模板直接调用。
解决方案
方案1:直接修改模板(最简便)
直接修改layout.html中调用用户名的代码,不用依赖路由传递的name变量,直接读取全局的current_user对象属性即可:
<div class="account-info"> {% if current_user.is_authenticated %} <span id="account-name"><a href="/dashboard">{{ current_user.user_name }}</a></span> {% else %} <span id="account-name"><a href="/dashboard">{{ dname }}</a></span> {% endif %} </div>
修改后不需要调整任何路由代码,全站所有继承了layout.html的页面都会自动显示登录用户名,原/dashboard路由里传递的name参数也可以直接删除,不会影响功能。
方案2:使用上下文处理器全局注入变量
如果你希望统一用name变量调用用户名,不需要在每个路由重复传递,可以在app.py中添加全局上下文处理器,自动给所有模板注入name变量:
# 放在app.py的任意位置,和其他路由平级即可 @app.context_processor def inject_global_vars(): name = '' if current_user.is_authenticated: name = current_user.user_name # 未登录的dname如果也需要全站通用,也可以在这里注入,不用每个路由传 return {'name': name, 'dname': '你设置的未登录显示文本'}
添加后原有layout.html代码不需要修改,所有页面都能正常读取到name变量。
内容的提问来源于stack exchange,提问作者Abhishek
相关产品推荐
相关产品推荐

