FastAPI desde la entrada hasta el combate real (12) - manejo de errores

Las solicitudes de error son muy importantes. Para escenarios como el control de permisos y el control de recursos, el servidor debe devolver las solicitudes de error a los usuarios, incluidos los códigos de estado y las solicitudes. Por lo tanto, este artículo registra principalmente el contenido relacionado con el manejo de errores en FastAPI.

lanza una 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"
    }

fastapiImporte de él HTTPExceptiony juzgue la salida en la función de operación de ruta;

El código anterior arroja un error cuando la entrada ides incorrecta , el código de error es y la información detallada esMinChess404not found

imagen-20221203164124803

Agregar encabezados de respuesta personalizados

@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"
    }

En algunos escenarios, es posible que el front-end deba HTTPagregar algunos encabezados de respuesta personalizados al error. El método de adición es el anterior y se puede configurar HTTPExceptiondirectamente headers;

imagen-20221203164434584

controlador de excepciones personalizado

Definir una Exceptionclase de error de tipo UnicornException, que corresponde a errores de falla de inicio de sesión, errores de código de verificación, etc. en aplicaciones prácticas;

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

Defina la función de manejo de errores en la aplicación principal UnicornException. Si no está en el mismo archivo, debe importar la clase correspondiente. Consulte el código fuente al final del artículo;

@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} 是错的!!!"
        }
    )

Simplemente declare en la aplicación e importe clases relacionadas;

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

La función anterior arroja un error cuando el nombre ingresado por el usuario es MinChess UnicornException; si la función de manejo de errores aquí necesita implementar un procesamiento global, debe montarse en la aplicación Taoist;

De acuerdo con la función de procesamiento anterior, MinChesscuando operamos la entrada, no solo devolveremos los datos predeterminados al front-end, sino que también generaremos información relevante en la consola, de la siguiente manera:

imagen-20221203164558523

imagen-20221203164641276

anular el controlador de excepciones predeterminado

Reescribir el controlador de excepciones predeterminado es intervenir manualmente la excepción predeterminada integrada en fastapi.El método es muy simple, solo reescríbalo como el método anterior;

@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)

La primera función anterior es el procesador de verificación de parámetros reescritos, que PlainTextResponseimprimirá errores específicos en la consola mientras devuelve información;

La segunda función anterior es el controlador de excepciones HTTPException reescrito , que también devuelve PlainTextResponseinformación e imprime errores específicos en la consola;

  • Comprobación de parámetros

Esta parte no necesita reescribir la función de operación. Si encuentra una solicitud escrita antes y envía un error del tipo incorrecto, se lanzará una excepción:

imagen-20221203170053064

imagen-20221203170120577

imagen-20221203165215816

  • Excepción HTTP
@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}

Para crear una nueva solicitud, también puede usar el primer ejemplo de este capítulo. El código anterior significa que cuando la entrada paramno es 2, HTTPExceptionse lanza una excepción:

imagen-20221203164912237

imagen-20221203164845563

código fuente

La estructura del proyecto es como se muestra en la siguiente figura, para una configuración específica, consulte la segunda sección del siguiente artículo:

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

imagen-20221203163907997

  • excepción.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
  • principal.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 StarletteHTTPException

app = 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 datetime

app08 = 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}


¡Gracias por leer!

Dirección de Jiumozhai: https://blog.jiumoz.com/archives/fastapi-cong-ru-men-dao-shi-zhan-12-cuo-wu-chu-li

Supongo que te gusta

Origin blog.csdn.net/qq_45730223/article/details/128167219
Recomendado
Clasificación