Day 18 Flask 错误处理与回应

如果在网页中输入了非预期的 URL,或是做出非预期的动作时,正常会出现 404 Not Found 对吧!不过有些网站的 404 Not Found 就是做得跟其他网站不一样,不单单只是出现简单的文字而已,有些甚至还有图片以及按钮对吧。

那我们要如何再产生这样的错误时,自动出现这样精美的画面呢?或是更进一步,由我们定义如果出现了某些行为,就自动地提出错误并处里呢?

errorhandler

既然前面提到了 404 那我就用 404 来实际做个范例吧。

首先,又是使用我们前面的架构来举例:

ithome
├── static  # 改回这样比较清楚吧
│   └── logo.svg
├── templates
│   ├── res
│   │   └── home.html
│   ├── base.html
│   ├── index.html
│   └── page_not_found.html  # 新增它
├── app.py
├── configs.py
├── Pipfile
└── Pipfile.lock

先来制作个简单的 404 Not Found 的画面吧。

page_not_found.html

{% extends 'base.html' %}

{% block title %}
    Error
{% endblock %}

{% block img %}
    <img src={{ url_for('static', filename='logo.svg' ) }} />
{% endblock %}

{% block content %}
    {% if error %}
        <p>{{ error }}</p>
    {% endif %}
    <a href={{ url_for('index') }}><button>Index</button></a>
{% endblock %}

然後再 app.py 写一个处里 404 错误的 function 就可以了。

app.py

@app.errorhandler(404)
def page_not_found(error):
    return render_template('page_not_found.html', error=error)

这样写装士气的话就可以再产生 404 错误的时候,有个单独的页面去显示错误,而不再只是简单的文字而已。就像这样:

看到这里,就对错误处理有个大概的了解了吧。装饰器 errorhandler 是指定如果抓到什麽样的错误就进行下面 function 的动作。

abort

那如果要更进一步,主动产生错误的话怎麽办呢?

其实 Flask 有一个 abort 的 function 可以主动产生错误。那就接着上面的架构再增加一个主动提出 401 错误的 url,实作大概长这样:

app.py

@app.route('/xyz')
def abc():
    abort(401)

大概就是这样。

make_response

那如果要回应的不仅仅是只有页面,甚是还有 HTTP 的标头,或是包含状态码,那又要如何回应呢?让我们使用前面的错误处里来举例:

@app.errorhandler(404)
def page_not_found(error):
    response = make_response(render_template('res/page_not_found.html', error=error), 404)
    response.headers['ABC'] = 'A value'
    
    return response

如果直接 return render_template 的话,虽然可以设定到有关标头或状态码,但如果要设定的项目较多,会变成非常长,所以有必要先建立一包回应的东西,再将所有设定都设好,最後再进行回传,

使用 make_response 便是制作回应包,第一个参数便是要回应的内容,第二个则是状态码,而下面便是设定标头了。

如果按下 F12 打开 Network,就可以看到回传标头的状态码是 404,以及设定好的标头。像这样:

如果接不设定就会像这样:

那麽就大概这样,如果做好错误处理,便可以避免意外的中断;做好回应,便可以在後面设定更多东西。

大家掰~掰~


<<:  [19] [烧瓶里的部落格] 09. 正式部署

>>:  [DAY25]Istio延伸功能-Rate Limits限流

虹语岚访仲夏夜-30(打杂的Allen终)

我拿出手机...安装了自己做的那个『心洞年代』...小七说,它会透过API,自动更新内容,就跟现在的...

[DAY22]安装Heroku Postgres插件

回到Heroku登入後点选resources 按下add-ons 找到Heroku postgres...

.Net Core Web Api_笔记22_Swagger自订文件并读取API注解描述

Swagger刚开始可以将其理解成网页版本的postman 我们可以对其测试发送资料看回传结果 在预...

让 GitHub Action 帮你天天登入 iThelp 赚取登入点数

前言 这是个人很久以前在闲暇之余写的一个专案,技术多为爬虫观念,後来整合 GitHub Action...

[Lesson16] Data Binding

使用DataBinding,首先在build.gradle (Module: app)里增加 and...