在 Flask 程序中自定义错误页面非常简单,我们先编写一个 404 错误页面模板,如 下所示:
* templates/404.html:404 错误页面模板

<!DOCTYPE html> 
<html lang="en"> 
<head><meta charset="utf-8"> 
    <title>{{ user.name }}'s Watchlist</title> 
    <link rel="icon" href="{{ url_for('static', filename='favico n.ico') }}"> 
    <link rel="stylesheet" href="{{ url_for('static', filename=' style.css') }}" type="text/css"> 
</head> 
<body>
    <h2><img alt="Avatar" class="avatar" src="{{ url_for('static ', filename='images/avatar.png') }}"> 
    {{ user.name }}'s Watchlist 
    </h2> <ul class="movie-list"> 
<li>Page Not Found - 404 
    <span class="float-right"> 
    <a href="{{ url_for('index') }}">Go Back</a> 
    </span> 
</li> 
    </ul> 
<footer> 
    <small>© 2018 <a href="http://helloflask.com/tutori al">HelloFlask</a></small> </footer> 
    </body> 
</html>

接着使用 app.errorhandler() 装饰器注册一个错误处理函数,它的作用和视图 函数类似,当 404 错误发生时,这个函数会被触发,返回值会作为响应主体返回给 客户端:
* app.py:404 错误处理函数

@app.errorhandler(404) # 传入要处理的错误代码 
def page_not_found(e): # 接受异常对象作为参数 
    user = User.query.first() 
    return render_template('404.html', user=user), 404 # 返回模 板和状态码
  • 提示 和我们前面编写的视图函数相比,这个函数返回了状态码作为第二个参 数,普通的视图函数之所以不用写出状态码,是因为默认会使用 200 状态码, 表示成功。

这个视图返回渲染好的错误模板,因为模板中使用了 user 变量,这里也要一并传 入。现在访问一个不存在的 URL,会显示我们自定义的错误页面:

无标题.png
编写完这部分代码后,你会发现两个问题:
* 错误页面和主页都需要使用 user 变量,所以在对应的处理函数里都要查询数 据库并传入 user 变量。因为每一个页面都需要获取用户名显示在页面顶部, 如果有更多的页面,那么每一个对应的视图函数都要重复传入这个变量。
* 错误页面模板和主页模板有大量重复的代码,比如 标签的内容,页 首的标题,页脚信息等。这种重复不仅带来不必要的工作量,而且会让修改变得更加麻烦。举例来说,如果页脚信息需要更新,那么每个页面都要一一进行 修改。
显而易见,这两个问题有更优雅的处理方法
下一篇继续学习和记录

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