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

评论

  • 最新随笔

  • 尝试让DALLE生成一些连续的精灵图,让gpt帮忙生成一些提示词,如果能稳定输出的话就很强大了。
    让gpt帮忙生成的DALLE提示词
    "Generate a pixel art sprite sheet of a character walking in four directions (north, south, east, west) in a retro video game style."
    "Create a series of pixel art frames showing a character performing different actions like walking, running, jumping, and attacking in a classic 2D game aesthetic."
  • 路过别人山庄的门口,被一条大黑狗边叫边追过来,幸好骑电动车,不然还不一定跑得过,哈哈哈哈哈哈哈哈哈哈。
  • 最近两周也没咋出去玩,主要也是觉得没啥好玩的(笑哭)。看完布莱恩阿瑟的《复杂经济学》后,里面那个酒吧问题勾起我的兴趣,最近空了就花了些时间实现个python版本,顺便搞了篇博文,很享受这种新知识能和已有知识碰撞的感觉。(配张前段时间拍的图片,梧桐山门口前面那条路,挺漂亮的)
  • 盐田港夜景
  • 为啥这猫总喜欢喝杯子里的水
  • 确实开始冷了,在树林里至少要比人类聚集区低个几度,进出入口就能很明显感觉到。看看深圳水库的风景,貌似后面的视野更开阔。
  • 给随笔加了多图的功能,传一传周末拍的风景图,漫无目的的逛也挺好玩的。
  • 逻辑自洽是一套体系的根基,最根本的因素,最吸引人的地方