在 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,会显示我们自定义的错误页面:
编写完这部分代码后,你会发现两个问题:
* 错误页面和主页都需要使用 user 变量,所以在对应的处理函数里都要查询数 据库并传入 user 变量。因为每一个页面都需要获取用户名显示在页面顶部, 如果有更多的页面,那么每一个对应的视图函数都要重复传入这个变量。
* 错误页面模板和主页模板有大量重复的代码,比如
显而易见,这两个问题有更优雅的处理方法
下一篇继续学习和记录