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 模板。

<完>

相关推荐
呱呱复呱呱8 分钟前
Django CBV 源码解读:一个请求是怎么找到你的 get() 方法的
python·django
曲幽5 小时前
刚部署的 LibreTranslate 频频翻车?我掏出了 20 年前的 StarDict 词典,用 FastAPI 搭了个本地词典翻译 API
python·fastapi·web·translate·goldendict·libretranslate·stardict·pystardict
荣码5 小时前
用Streamlit给AI应用套个界面,10行代码出Web页面
java·python
兵慌码乱15 小时前
基于Python+PyQt5+SQLite的药房管理系统实现:事务一致性与界面解耦全流程解析
python·sqlite·信号与槽·pyqt5·数据库设计·桌面应用开发·事务处理
金銀銅鐵16 小时前
[Python] 体验用欧几里得算法计算最大公约数的过程
python·数学
FreakStudio20 小时前
W55MH32L-EVB 上手测评:硬件 TCP/IP 加持的以太网单片机,MicroPython 零门槛开发
python·单片机·嵌入式·大学生·面向对象·并行计算·电子diy·电子计算机
用户03321266636721 小时前
使用 Python 从零创建 Word 文档
python
Csvn1 天前
Python 两大经典坑点 —— 可变默认参数 & 闭包延迟绑定
后端·python
曲幽1 天前
别再用网页翻译看源码了!你的私人翻译神器LibreTranslate,部署避坑指南来了
python·docker·web·pot·translate·libretranslate·arogstranslate
用户556918817531 天前
#从脚本到独立程序:Python + Playwright 批量抓取的完整踩坑记录
python·自动化运维