很多时候,用户输入的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),那我们下篇再见吧。

评论

  • 最新随笔

  • 对我来说,写东西很好的一点是,自己写的东西,后面基本都会再看,一遍或者很多遍。这样就可以很好地发现自己之前的漏洞,并看看现在有什么变化。
  • 前段时间应该是百度更新了页面结构,那个黑帽泛目录网站我也没有去更新代码,就导致了文章页没有相关推荐,没想到这时候谷歌开始收录了,而且效果还不错。其实之前在谷歌一直不收录的时候就有怀疑过没有尽头的相关推荐很可能是导致不收录的原因,不过也一直没有去管它,而这次误打误撞的收录也恰恰证实了这个想法。(btw,其实这个网站从出现固定链接开始叫泛目录应该不太准确)
  • 最近吉他谱网站iloveguitar上线了,这几天在填充一些内容花了一些时间,这个网站也是使用flask作为后端框架的,前端UI框架使用的是bootstrap4,喜欢吉他的小伙伴欢迎来这里逛一逛哟,有什么建议欢迎在留言板提一下哟。
  • 那个泛目录网站发布了几个星期了,百度没怎么来爬,收了一个首页,谷歌直接就不收了,倒是一个查外链的网站天天来爬(笑哭),还有建议一点就是泛目录还是用在有建站历史的域名比较好(因为已经过了审核期),新域名就尽量不要用了。
  • 刚刚又发了一篇,最近文章百度都不太收录,orz,哈哈
  • 之前那个用python做的静态资源服务器,我又发现了一大用处,现在我都用来在局域网里的不同电脑之间传输文件,真的好用哈哈
  • 今天交换到了博客有史以来第一条友情链接
  • 刚刚更新了一下博客,修复了一些bug,添加了一个项目页