• 错误页面和主页都需要使用 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里面去申明了.

最后修改:2022 年 12 月 05 日
如果觉得我的文章对你有用,请随意赞赏