Python Flask 在网页应用程序中处理错误和异常
- Python Flask 在网页应用程序中处理错误和异常
Python Flask 在网页应用程序中处理错误和异常
在我们所有的代码示例中,我们没有注意如何处理用户在浏览器中输入错误的URL或向我们的应用程序发送错误的参数集的情况。这不是设计意图,但目的是首先关注网页应用程序的关键组件。网页框架的美妙之处在于,它们通常默认支持错误处理。如果发生任何错误,将自动返回相应的状态代码。错误代码被很好地定义为HTTP协议的一部分。例如,从400到499的错误代码表示客户端请求的错误,而从500到599的错误代码则表示服务器在执行请求时出现问题。下面总结了一些常见的错误:
错误代码 | 名字 | 描述 |
---|---|---|
400 | Bad Request (坏请求) | 这个错误表明了或者 URL 或者 请求内容有错误 |
401 | Unauthorized (未认证) | 当用户名或密码错误或没有提供时,会出现这个错误 |
403 | Forbidden (禁止) | 这个错误表明一个用户访问了他不被允许访问的资源 |
404 | Not Found (未发现) | 当客户端尝试访问不存在的资源时,会返回这个错误。通常情况下是 URL 错了。 |
500 | Interanl Server Error(服务器内部错误) | 这个错误表明了请求是正确的,但是在服务器内部出现了错误。 |
在 https://httpstatuses.com/
这个网站上有完整的错误列表。
Flask 框架还附带了一个错误处理框架。在处理客户端请求时,如果我们的程序崩溃,默认情况下会返回 500 Internal Server Error
。如果客户端请求的 URL 未映射到任何Python函数,Flask 将向客户端返回 404 Not Found
错误。这些不同的错误类型被实现为HTTPException
类的子类,该类是 Flask 库的一部分。
如果我们想用自定义行为或自定义消息处理这些错误或异常,我们可以向 Flask 应用程序注册我们的处理程序。请注意,错误处理程序是 Flask 中的一个函数,仅在发生错误时触发,我们可以将特定的错误或通用异常与我们的处理程序相关联。我们构建了一个示例代码来从较高的层次说明这个概念。首先,我们将演示一个简单的网页应用程序,它有两个函数(hello
和 greeting
)来处理两个URL,如下面的示例代码所示:
# 第一部分
import json
from flask import Flask, render_template, abort
from werkzeug.exceptions import HTTPException
app = Flask(__name__)
@app.route('/')
def hello():
return "Hello, World!"
@app.route('/greeting')
def greeting():
x = 10 / 0
return "你不会看到这个提示。"
为了处理错误,我们将使用 errorHandler
装饰器针对应用程序实例注册我们的处理程序。对于我们的示例代码(如下所示),我们针对 Flask 应用程序的错误代码 404
注册了一个 page_not_found
处理程序。对于错误代码 500
,我们注册了一个 internal error
函数作为错误处理程序。最后,我们为 HTTPException
类注册了 generic_handler
。此通用处理程序将捕获 404
和 500
以外的错误或异常。下面显示了一个包含所有三个处理程序的示例代码:
# 第二部分
@app.errorhandler(404)
def page_not_found(error):
return render_template('error404.html'), 404
@app.errorhandler(500)
def internal_server_error(error):
return render_template('error500.html'), 500
@app.errorhandler(HTTPException)
def generic_error_handler(error):
error_detail = json.dumps({
"code": error.code,
"name": error.name,
"description": error.description,
})
return render_template("error.html", err_msg=error_detail), error.code
为了便于说明,我们还编写了带有自定义消息的基本 Jinja 模板:error404.html
、error500.html
和 error.html
。error404.html
和 error500.html
模板使用的是模板中硬编码的消息。但是,error.html
模板需要来自网页服务器的自定义消息。为了测试这些示例应用程序,我们将通过浏览器或 curl
实用程序请求以下内容:
GET http://localhost:5000/
:我们期望一个普通的回应;GET http://localhost:5000/hello
:我们期望一个404
错误。这是因为没有 Python 程序映射到/hello
网址,Flask 应用程序会渲染error404.html
;GET http://localhost:5000/greeting
:我们期望一个500
错误。这是因为我们尝试用零除一个数,然后触发了ZeroDevisionError
异常。因为这是一个服务端错误,它会触发internal_server_error
处理函数,这个函数会渲染error500.html
;POST http://localhost:5000/
:为了模拟通用处理程序的角色,我们将发送一个触发404
和500
以外的错误代码的请求。这很容易实现,只需发送一个期待GET
请求的 URL 的POST
请求,在这种情况下,服务器将引发405
错误(对于不受支持的HTTP方法)。我们的应用程序中没有专门针对错误代码405
的错误处理程序,但我们已经注册了一个带有HTTPException
的通用处理程序。此通用处理程序将处理此错误并呈现通用error.html
模板。
<完>