18.FastAPI错误处理

发布一下 0 0

18.FastAPI错误处理

18.1 HTTPException

当我们需要在FastAPI中返回错误时,可以使用HTTPException返回错误信息。HTTPException是包含了与API相关数据的Python异常,所以在程序需要raise,而不是return。 HTTPException的参数包括:

  • status_code 状态码
  • detail 详细信息,可以使用能够转换为JSON格式的任何数据类型,不止于str
  • headers 自定义响应头

代码示例:

# coding: utf-8from fastapi import FastAPIfrom fastapi import HTTPExceptionapp = FastAPI()langs = {    'python': 'Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆 于1990 年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。',    'go': 'Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。'}@app.get(path='/language/{lang_name}')def language(lang_name: str):    if lang_name not in langs:        raise HTTPException(            status_code=404,            detail={'Error': 'The language not found.'},            headers={'X-Error': 'The language not found.'}        )    return langs[lang_name]

执行请求:

curl http://127.0.0.1:8000/language/python -iHTTP/1.1 200 OKdate: Tue, 01 Feb 2022 08:07:46 GMTserver: uvicorncontent-length: 478content-type: application/json"Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆 于1990 年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。"

上面的请求是一个返回正确结果的请求。下面执行一个返回错误的请求:

curl http://127.0.0.1:8000/language/c -iHTTP/1.1 404 Not Founddate: Tue, 01 Feb 2022 08:08:48 GMTserver: uvicornx-error: The language not found.content-length: 46content-type: application/json{"detail":{"Error":"The language not found."}}

18.2自定义异常处理

在FastAPI中,可以根据用户的需求进行自定义异常的封装和处理,对于自定义异常首先需要定义一个继承自Exception的自定义异常类,然后使用 @app.exception_handler() 添加自定义异常控制器。这样就可以在路由方法中raise相应的异常进行响应。

代码示例:

# coding: utf-8from fastapi import FastAPIfrom fastapi import Requestfrom fastapi.responses import JSONResponseclass LangException(Exception):    def __init__(self, name: str):        self.name = nameapp = FastAPI()@app.exception_handler(LangException)async def lang_exception_handle(request: Request, ex: LangException):    return JSONResponse(        status_code=418,        content='Not found the language: %s' % ex.name    )langs = {    'python': 'Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆 于1990 年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。',    'go': 'Go(又称 Golang)是 Google 的 Robert Griesemer,Rob Pike 及 Ken Thompson 开发的一种静态强类型、编译型语言。Go 语言语法与 C 相近,但功能上有:内存安全,GC(垃圾回收),结构形态及 CSP-style 并发计算。'}@app.get(path='/language/{lang_name}')def language(lang_name: str):    if lang_name not in langs:        raise LangException(lang_name)    return langs[lang_name]

执行请求:

curl http://127.0.0.1:8000/language/python -iHTTP/1.1 200 OKdate: Tue, 01 Feb 2022 08:26:33 GMTserver: uvicorncontent-length: 478content-type: application/json"Python由荷兰数学和计算机科学研究学会的吉多·范罗苏姆 于1990 年代初设计,作为一门叫做ABC语言的替代品。Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。"curl http://127.0.0.1:8000/language/c -iHTTP/1.1 418date: Tue, 01 Feb 2022 08:26:39 GMTserver: uvicorncontent-length: 27content-type: application/json"Not found the language: c"

从以上示例可以看出,当请求http://127.0.0.1:8000/language/c时,由于找不到c语言的说明,所以触发LangException异常,该异常将被lang_exception_handle方法处理。



版权声明:内容来源于互联网和用户投稿 如有侵权请联系删除

本文地址:http://0561fc.cn/60054.html