- 错误页面和主页都需要使用 user 变量,所以在对应的处理函数里都要查询数 据库并传入 user 变量。因为每一个页面都需要获取用户名显示在页面顶部, 如果有更多的页面,那么每一个对应的视图函数都要重复传入这个变量。
- 错误页面模板和主页模板有大量重复的代码,比如 标签的内容,页 首的标题,页脚信息等。这种重复不仅带来不必要的工作量,而且会让修改变得更加麻烦。举例来说,如果页脚信息需要更新,那么每个页面都要一一进行修改。
显而易见,这两个问题有更优雅的处理方法:
模板上下文处理函数
对于多个模板内都需要使用的变量,我们可以使用 app.context_processor 装 饰器注册一个模板上下文处理函数,如下所示:
* app.py:模板上下文处理函数
@app.context_processor
def inject_user(): # 函数名可以随意修改
user = User.query.first()
return dict(user=user) # 需要返回字典,等同于return {'user': u ser}
这个函数返回的变量(以字典键值对的形式)将会统一注入到每一个模板的上下文 环境中,因此可以直接在模板中使用。
现在我们可以删除 404 错误处理函数和主页视图函数中的 user 变量定义,并删 除在 render_template() 函数里传入的关键字参数:
@app.context_processor
def inject_user():
user = User.query.first()
return dict(user=user)
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'), 404
@app.route('/')
def index():
movies = Movie.query.all()
return render_template('index.html', movies=movies)
同样的,后面我们创建的任意一个模板,都可以在模板中直接使用 user 变量。
而不必每次都在app.py里面去申明了.