很多时候,用户输入的url不一定存在,或者服务器出现了错误,我们就需要告诉浏览器发生了什么,我们就会从服务器返回一些包含特定意义的状态码,比如404(页面不存在或被删除)、500(服务器内部错误)等等,但是这些状态码是直接告诉浏览器或者搜索引擎,需要打开开发者工具查看响应状态或者网络页才能看到,如果用户不打开的话就不知道怎么回事,所以我们就需要返回一些错误的页面给用户,也告诉用户到底发生了什么错误。
像一些常见的服务器就会有一些错误页面,比如下面就分别是nginx和apache的错误页面。
(nginx错误页)
(apache错误页)
有了错误页我们就可以告诉用户网页无法正常显示的原因,下面我们来看看flask如何实现错误页面吧。
其实我们在之前的那一篇中讲过可以直接在响应的内容上设置状态码,但是它只能在一个路由上设置,非常麻烦,所以我们可以通过通用的方法来设定错误的页面,只要这个路由不匹配或者是其他问题就返回设定好的错误页面,下面是具体写法。
frog.py
@app.errorhandler(404)
def page_not_found(e):
return render_template('404.html'),404
我们通过flask内置的errorhandler装饰器来设定各种错误码需要返回的特定页面,下面我们再写一个简单的404页面吧。
templates/404.html
{% extends 'base.html' %}
{% block title %}404 not found{% endblock %}
{% block content %}
<h1>404 page not found</h1>
{% endblock %}
这样设定之后,只要用户访问了不存在的页面或者无法匹配的url就会返回带有404状态码的404错误页面。
类似的,我们也可以设置500错误页,只要flask出现错误,我们就可以返回我们自定义的500错误页面
frog.py
@app.errorhandler(500)
def internal_server_error(e):
return render_template('500.html'),500
templates/500.html
{% extends 'base.html' %}
{% block title %}500 internal server error{% endblock %}
{% block content %}
<h1>500 internal server error</h1>
{% endblock %}
我们随便在frog.py中随便print一个未声明的变量,并将FLASK_DEBUG设置为0,将调试模式关闭,然后再次运行flask,就可以看到我们自定义的500错误页面啦。
有的时候,url的确是可以匹配得到,但是可能因为该url所带的参数不符合我们的一些要求,需要提前或者强制返回一些错误的页面,那么就可以用到flask提供的abort()
函数,在abort()
中添加需要返回的错误码,就会提前返回该错误页,路由函数中后续的代码也不会继续执行了,下面是具体用法
frog.py
from flask import abort
@app.route('/i-love/<obj>')
def ilove(obj):
if obj=='shit':
abort(404)
return '<h1>I love %s</h1>' % obj
当我们访问http://127.0.0.1:5000/i-love/apple
时是会正常显示I love apple的,但是如果我们访问http://127.0.0.1:5000/i-love/shit
则会返回一个带404状态码的404错误页面。有了abort()
我们就可以定制更多条件需求复杂的功能了。
以上就是flask错误页面的简单介绍了,这一篇还是比较简单的,稍微看一下就很容易理解,这个是本篇的仓库地址(http://codemole.cn/felix/Frog/src/frog3.4),那我们下篇再见吧。