当前位置: 首页 > article >正文

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

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

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

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

在我们所有的代码示例中,我们没有注意如何处理用户在浏览器中输入错误的URL或向我们的应用程序发送错误的参数集的情况。这不是设计意图,但目的是首先关注网页应用程序的关键组件。网页框架的美妙之处在于,它们通常默认支持错误处理。如果发生任何错误,将自动返回相应的状态代码。错误代码被很好地定义为HTTP协议的一部分。例如,从400到499的错误代码表示客户端请求的错误,而从500到599的错误代码则表示服务器在执行请求时出现问题。下面总结了一些常见的错误:

错误代码名字描述
400Bad Request (坏请求)这个错误表明了或者 URL 或者 请求内容有错误
401Unauthorized (未认证)当用户名或密码错误或没有提供时,会出现这个错误
403Forbidden (禁止)这个错误表明一个用户访问了他不被允许访问的资源
404Not Found (未发现)当客户端尝试访问不存在的资源时,会返回这个错误。通常情况下是 URL 错了。
500Interanl Server Error(服务器内部错误)这个错误表明了请求是正确的,但是在服务器内部出现了错误。

https://httpstatuses.com/ 这个网站上有完整的错误列表。

Flask 框架还附带了一个错误处理框架。在处理客户端请求时,如果我们的程序崩溃,默认情况下会返回 500 Internal Server Error。如果客户端请求的 URL 未映射到任何Python函数,Flask 将向客户端返回 404 Not Found错误。这些不同的错误类型被实现为HTTPException 类的子类,该类是 Flask 库的一部分。

如果我们想用自定义行为或自定义消息处理这些错误或异常,我们可以向 Flask 应用程序注册我们的处理程序。请注意,错误处理程序是 Flask 中的一个函数,仅在发生错误时触发,我们可以将特定的错误或通用异常与我们的处理程序相关联。我们构建了一个示例代码来从较高的层次说明这个概念。首先,我们将演示一个简单的网页应用程序,它有两个函数(hellogreeting)来处理两个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。此通用处理程序将捕获 404500 以外的错误或异常。下面显示了一个包含所有三个处理程序的示例代码:

# 第二部分
@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 模板。

<完>


http://www.kler.cn/a/580886.html

相关文章:

  • python实现的生态模拟系统
  • 牛客周赛:84:C:JAVA
  • P9242 [蓝桥杯 2023 省 B] 接龙数列--DP【巧妙解决接龙问题】
  • AI 帮我精准定位解决 ReferenceError: process is not defined (文末附AI名称)
  • Spring WebFlux:响应式编程
  • python使用venv命令创建虚拟环境(ubuntu22)
  • OSPF:虚链路
  • 零基础掌握Linux SCP命令:5分钟实现高效文件传输,小白必看!
  • Unity Dots从入门到精通 Mono和Dots通讯
  • DOCKER模式部署GITLAB
  • 回溯-子集
  • Java集合_八股场景题
  • vue2动态增删表单+表单验证
  • WPF预览并打印FlowDocument
  • Python数据分析之数据处理与分析
  • 修改 Docker 网桥的 IP 范围
  • Oracle RAC配置原理详解:构建高可用与高性能的数据库集群
  • HTML 超链接(简单易懂较详细)
  • NO.29十六届蓝桥杯备战|string九道练习|reverse|翻转|回文(C++)
  • AI算法与应用 全栈开发 前端开发 后端开发 测试开发 运维开发