如果在网页中输入了非预期的 URL,或是做出非预期的动作时,正常会出现 404 Not Found
对吧!不过有些网站的 404 Not Found
就是做得跟其他网站不一样,不单单只是出现简单的文字而已,有些甚至还有图片以及按钮对吧。
那我们要如何再产生这样的错误时,自动出现这样精美的画面呢?或是更进一步,由我们定义如果出现了某些行为,就自动地提出错误并处里呢?
既然前面提到了 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 的动作。
那如果要更进一步,主动产生错误的话怎麽办呢?
其实 Flask 有一个 abort 的 function 可以主动产生错误。那就接着上面的架构再增加一个主动提出 401 错误的 url,实作大概长这样:
app.py
@app.route('/xyz')
def abc():
abort(401)
大概就是这样。
那如果要回应的不仅仅是只有页面,甚是还有 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,以及设定好的标头。像这样:
如果接不设定就会像这样:
那麽就大概这样,如果做好错误处理,便可以避免意外的中断;做好回应,便可以在後面设定更多东西。
大家掰~掰~
>>: [DAY25]Istio延伸功能-Rate Limits限流
我拿出手机...安装了自己做的那个『心洞年代』...小七说,它会透过API,自动更新内容,就跟现在的...
回到Heroku登入後点选resources 按下add-ons 找到Heroku postgres...
Swagger刚开始可以将其理解成网页版本的postman 我们可以对其测试发送资料看回传结果 在预...
前言 这是个人很久以前在闲暇之余写的一个专案,技术多为爬虫观念,後来整合 GitHub Action...
使用DataBinding,首先在build.gradle (Module: app)里增加 and...