错误提示是非常重要的,比如权限控制、资源控制等场景,需要服务器返回给用户错误提示,包括状态码和提示等内容,所以本文就主要记录FastAPI里的错误处理相关的内容

抛出一个HTTPException

@app08.get("/stu08/{id}")
def stu08_get_error(id: str = Path(...)
):if id != "MinChess":return HTTPException(status_code=404, detail="not found")return {"name": "MinChess","age": 22,"Blog": "https://blog.jiumoz.com"}

fastapi中导入HTTPException,并在路径操作函数中进行判断输出即可;

上面的代码就是当输入的id不为MinChess的时候抛出错误,错误代码为404,详细信息为not found

添加自定义响应头

@app08.get("/stu08/header/{id}")
def stu08_get_error_header(id: str
):if id != "MinChess":raise HTTPException(status_code=404,detail="Not Found",headers={"X-Error": "There gose my error."})return {"name": "MinChess","age": 22,"Blog": "https://blog.jiumoz.com"}

有些场景的前端可能需要在HTTP的错误中添加一些自定义的响应头,添加方法如上,直接设置HTTPExceptionheaders即可;

自定义异常处理器

定义一个Exception类型错误类UnicornException,在实际应用中就对应登录失败错误、验证码错误等;

class UnicornException(Exception):def __init__(self, name: str):self.name = name

在主应用中为UnicornException错误定义处理函数,如果没在同一个文件内,需要导入对应的类,参考文末的源码;

@app.exception_handler(exception.UnicornException) # 用@app.exception_handler() 为UnicornException添加自定义异常控制器
async def unicorn_exception_handler(request: Request, exc: exception.UnicornException):""":param request: 请求头:param exc: 异常对象:return:"""print(f"全局自定义异常:method:{request.method} URL:{request.url}Headers:{request.headers}")return JSONResponse(status_code=418,content={"message": f"你输入的: {exc.name} 是错的!!!"})

在应用中进行声明即可,要导入相关的类;

@app08.get("/stu08/custom/{name}")
async def stu08_custom(name: str = Path(default="MinChess")
):if name == "MinChess":raise UnicornException(name=name)return {"name": "MinChess"}

上面的函数就是当用户输入的name为MinChess的时候,抛出一个UnicornException错误;这里的错误处理函数要实现全局处理的话,就一定要挂载道主应用上;

根据上面的处理函数,我们操作输入MinChess的时候,不仅会返回给前端既定的数据,也会在控制台进行相关信息的输出,如下:

重写默认异常处理器

重写默认的异常处理器就是将fastapi内置的默认异常进行人为干预,方法很简单,同上面的方法,进行重写即可;

@app.exception_handler(RequestValidationError)  # 重写请求验证异常处理器
async def request_validation_exception_handler(request: Request, exc: RequestValidationError):"""请求参数验证异常:param request: 请求头信息:param exc: 异常对象:return:"""# 日志记录异常详细上下文print(f"全局异常:{request.method}URL{request.url}Headers:{request.headers}{traceback.format_exc()}")return PlainTextResponse(str(exc), status_code=400)@app.exception_handler(StarletteHTTPException)  # 重写HTTPException异常处理器
async def http_exception_handler(request, exc):print(f"全局异常:{request.method}URL{request.url}Headers:{request.headers}{traceback.format_exc()}")return PlainTextResponse(str(exc.detail), status_code=exc.status_code)

上面的第一个函数就是重写的参数校验的处理器,返回PlainTextResponse信息的同时会在控制台打印具体错误;

上面的第二个函数就是重写的HTTPException异常的处理器,同样返回PlainTextResponse信息的同时会在控制台打印具体错误;

  • 参数校验

这部分不需要重新写操作函数,找到之前写的某一个请求,发送错误类型的错误就会抛出异常:

  • HTTPException
@app08.get("/stu08/Request_Validation_Error/{param}")
async def stu08_request_validation_error(param: int):if param != 2:raise HTTPException(detail="请输入MinChess!", status_code=410)return {"param": param}

新建一个请求,用本章第一个例子也可以,上面的代码就表示当输入的param不为2时,抛出HTTPException异常:

源码

项目结构如下图,具体的配置可以参看下面文章的第二节:

https://blog.jiumoz.com/archives/fastapi-cong-ru-men-dao-shi-zhan-13-chang-jian-pei-zhi-xiang

  • exception.py
# -*- coding: utf-8 -*-
# @Time: 2022/12/2 16:28
# @Author: MinChess
# @File: exception.py
# @Software: PyCharm
class UnicornException(Exception):def __init__(self, name: str):self.name = name
  • main.py
from fastapi import FastAPI, Request
from fastapi.responses import JSONResponse, PlainTextResponse, HTMLResponse
from fastapi.exceptions import RequestValidationError
from fastapi.staticfiles import StaticFiles
from stu import app01, app02, app03, app04, app05, app06, app07, app08
import uvicorn
import traceback
from utils import exception # 导入类
from starlette.exceptions import HTTPException as StarletteHTTPExceptionapp = FastAPI(# 创建一个FastAPI实例\这里的变量 app 会是 FastAPI 类的一个「实例」。\这个实例将是创建你所有 API 的主要交互对象。\这个 app 同样在命令中被 uvicorn 所引用:title='FastAPI学习教程文档——title',description='这是FastAPI教程的文档——description',version='1.0.0',docs_url='/docs',redoc_url='/redoc',
)app.mount(path="/static", app=StaticFiles(directory='./static'), name='static')@app.exception_handler(exception.UnicornException) # 用@app.exception_handler() 为UnicornException添加自定义异常控制器
async def unicorn_exception_handler(request: Request, exc: exception.UnicornException):""":param request: 请求头:param exc: 异常对象:return:"""print(f"全局自定义异常:method:{request.method} URL:{request.url}Headers:{request.headers}")return JSONResponse(status_code=418,content={"message": f"你输入的: {exc.name} 是错的!!!"})@app.exception_handler(RequestValidationError)  # 重写请求验证异常处理器
async def request_validation_exception_handler(request: Request, exc: RequestValidationError):"""请求参数验证异常:param request: 请求头信息:param exc: 异常对象:return:"""# 日志记录异常详细上下文print(f"全局异常:{request.method}URL{request.url}Headers:{request.headers}{traceback.format_exc()}")return PlainTextResponse(str(exc), status_code=400)@app.exception_handler(StarletteHTTPException)  # 重写HTTPException异常处理器
async def http_exception_handler(request, exc):print(f"全局异常:{request.method}URL{request.url}Headers:{request.headers}{traceback.format_exc()}")return PlainTextResponse(str(exc.detail), status_code=exc.status_code)
  • stu08.py
# -*- coding: utf-8 -*-
# @Time: 2022/12/1 14:55
# @Author: MinChess
# @File: stu08.py
# @Software: PyCharm
from fastapi import APIRouter, HTTPException, Path,Body
from fastapi.exceptions import RequestValidationError
from fastapi.encoders import jsonable_encoder
from typing import Optional, List
from pydantic import Field
from utils import UnicornException
from pydantic import BaseModel
from datetime import datetimeapp08 = APIRouter()# 抛出HTTPException
@app08.get("/stu08/{id}")
def stu08_get_error(id: str = Path(...)
):if id != "MinChess":return HTTPException(status_code=404, detail="not found")return {"name": "MinChess","age": 22,"Blog": "https://blog.jiumoz.com"}# 添加自定义响应头
@app08.get("/stu08/header/{id}")
def stu08_get_error_header(id: str
):if id != "MinChess":raise HTTPException(status_code=404,detail="Not Found",headers={"X-Error": "There gose my error."})return {"name": "MinChess","age": 22,"Blog": "https://blog.jiumoz.com"}# Theere id MinChess's python pro
# 自定义异常处理器@app08.get("/stu08/custom/{name}")
async def stu08_custom(name: str = Path(default="MinChess")
):if name == "MinChess":raise UnicornException(name=name)return {"name": "MinChess"}@app08.get("/stu08/Request_Validation_Error/{param}")
async def stu08_request_validation_error(param: int):if param != 2:raise HTTPException(detail="请输入MinChess!", status_code=410)return {"param": param}

感谢阅读!

九陌斋地址:https://blog.jiumoz.com/archives/fastapi-cong-ru-men-dao-shi-zhan-12-cuo-wu-chu-li

FastAPI从入门到实战(12)——错误处理相关推荐

  1. FastAPI从入门到实战(0)——初识FastAPI

    本文主要介绍一下FastAPI是什么,多数内容摘自官网:https://fastapi.tiangolo.com/zh/ FastAPI是什么 FastAPI 是一个用于构建 API 的现代.快速(高 ...

  2. FastAPI从入门到实战(11)——表单请求与上传文件

    本文主要记录表单的数据请求以及上传不同大小的文件.上传多个文件.获取文件信息等相关内容. 表单请求 @app07.post("/stu07/form") def stu07_for ...

  3. FastAPI从入门到实战(15)——设置通用路由

    本文主要记录fastapi实现一个接口多个请求方式的实现:例如同样的接口,既可以通过查询参数或路径参数的方式请求得到数据,也可以通过发送请求体的方式得到响应. 常见的请求方式 Get 向特定资源发出请 ...

  4. Redis6入门到实战------思维导图+章节目录

    Redis学习大纲 思维导图 思维导图 Redis6入门到实战------1.NoSQL数据库简介 地址: Redis6入门到实战------2.Redis6概述和安装 地址: Redis6入门到实战 ...

  5. 《Python编程:从入门到实战》学习笔记(第2版) 第1-2章 起步变量和简单数据类型

    [写在前面]为进一步提高自己的python代码能力,打算把几本经典书籍重新过一遍,形成系统的知识体系,同时适当记录一些学习笔记,我尽量及时更新!先从经典的<Python编程:从入门到实战> ...

  6. android开发入门与实践_我的新书《Android App开发入门与实战》已经出版

    前言 工作之余喜欢在CSDN平台上写一些技术文章,算下时间也有两三年了.写文章的目的一方面是自己对技术的总结,另一方面也是将平时遇到的问题和解决方案与大家分享,还有就是在这个平台上能和大家共同交流. ...

  7. 零基础学python实战-Python3.6零基础入门与实战 PDF 带源码视频版

    给大家带来的一篇关于Python相关的电子书资源,介绍了关于Python 3.6.入门.实战方面的内容,本书是由清华大学出版社出版,格式为PDF,资源大小518.9 MB,王启明编写,目前豆瓣.亚马逊 ...

  8. 《零基础掌握 Python 入门到实战》笔记

    Python 零基础掌握 Python 入门到实战笔记 文章目录 Python 内置对象类型 基本交互语句 常用内置函数 整数与浮点数 基本数学运算 高级数学运算 字符串 序列 索引 切片 成员函数 ...

  9. 《Python编程:从入门到实战》(第2版)学习笔记 第5章 if语句

    [写在前面]为进一步提高自己的python代码能力,打算把几本经典书籍重新过一遍,形成系统的知识体系,同时适当记录一些学习笔记,我尽量及时更新!先从经典的<Python编程:从入门到实战> ...

最新文章

  1. 深度学习基础——激活函数以及什么时候使用它们?
  2. Ubuntu系发行版安装deepin wine QQ的步骤
  3. 增加第三方插件_AE插件排行!!
  4. myeclipse始终build workspace
  5. 百万数据php7取出循环_PHP7带来了哪些重要的变化
  6. C#中对 XML节点进行增、删、改、查
  7. CentOS7 - 给VMwear Workstation 15安装VMwear tools
  8. coolfire文章之六
  9. 超级终端之——MobaXterm
  10. CCNA考试题库中英文翻译版及答案5
  11. 简单线性回归的应用及画图(一)
  12. 短视频源码应该优化的六个方面
  13. .dat文件三维点云可视化
  14. PLC扩展模块总线连接方式?IO扩展模块和主模块。西门子用到的总线中的一种背板总线简单介绍扩展模块中也有控制芯片(CPU)(或者类似SPI协议芯片),除了扩展模块(SM)还有扩展板(SB)
  15. Android 自定义表格(第一行及第一列固定,其他列可滑动)
  16. 怎么解决电脑系统故障?
  17. 计算机管理即插即用服务,意外终止Plug and Play(即插即用)服务开启方法
  18. ps无缝拼图教程一:无缝拼接花纹图案
  19. 自从我使用HiFlow场景连接器后,在也不用担心成为“落汤鸡”了
  20. TTL传输中过期问题导致网站打不开

热门文章

  1. JavaScript中等等与(==)和全等于(===)以及不等于和不全等于
  2. 解决2020版IDEA的JAVAScript中找不到vue.js问题
  3. 应用型本科如何找好工作
  4. inception retrain 实现
  5. libpng库的生成
  6. input与span之间莫名的空隙
  7. echarts地图 图例 visualMap
  8. 注解用法详解——@RequestMapping
  9. mysql 用户 %_mysql用户操作 - 可爱的wzz的个人空间 - OSCHINA - 中文开源技术交流社区...
  10. elementUi中的el-input去掉border边框