Python Flask 在网页应用程序中处理错误和异常

Python Flask 在网页应用程序中处理错误和异常

  • [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 中的一个函数,仅在发生错误时触发,我们可以将特定的错误或通用异常与我们的处理程序相关联。我们构建了一个示例代码来从较高的层次说明这个概念。首先,我们将演示一个简单的网页应用程序,它有两个函数(hellogreeting)来处理两个URL,如下面的示例代码所示:

python 复制代码
# 第一部分
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。此通用处理程序将捕获 404500 以外的错误或异常。下面显示了一个包含所有三个处理程序的示例代码:

python 复制代码
# 第二部分
@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.htmlerror500.htmlerror.htmlerror404.htmlerror500.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/:为了模拟通用处理程序的角色,我们将发送一个触发 404500 以外的错误代码的请求。这很容易实现,只需发送一个期待 GET 请求的 URL 的 POST 请求,在这种情况下,服务器将引发 405 错误(对于不受支持的HTTP方法)。我们的应用程序中没有专门针对错误代码 405 的错误处理程序,但我们已经注册了一个带有 HTTPException 的通用处理程序。此通用处理程序将处理此错误并呈现通用 error.html 模板。

<完>

相关推荐
_一条咸鱼_27 分钟前
Python 数据类型之可变与不可变类型详解(十)
人工智能·python·面试
_一条咸鱼_27 分钟前
Python 入门之基本运算符(六)
python·深度学习·面试
h汉堡29 分钟前
C++入门基础
开发语言·c++·学习
_一条咸鱼_30 分钟前
Python 流程控制之 for 循环(九)
人工智能·python·面试
_一条咸鱼_32 分钟前
Python 语法入门之流程控制 if 判断(七)
人工智能·python·面试
_一条咸鱼_33 分钟前
Python 流程控制之 while 循环(八)
人工智能·python·面试
HtwHUAT1 小时前
实验四 Java图形界面与事件处理
开发语言·前端·python
鄃鳕1 小时前
QSS【QT】
开发语言·qt
Tech Synapse1 小时前
基于Surprise和Flask构建个性化电影推荐系统:从算法到全栈实现
python·算法·flask·协同过滤算法
麦麦大数据1 小时前
vue+flask+CNN电影推荐系统
pytorch·python·cnn·flask·scikit-learn·电影推荐