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"
}
fastapi
Importe de élHTTPException
y juzgue la salida en la función de operación de ruta;El código anterior arroja un error cuando la entrada
id
es incorrecta , el código de error es y la información detallada esMinChess
404
not found
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
HTTP
agregar algunos encabezados de respuesta personalizados al error. El método de adición es el anterior y se puede configurarHTTPException
directamenteheaders
;
controlador de excepciones personalizado
Definir una Exception
clase 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,
MinChess
cuando 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:
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
PlainTextResponse
imprimirá 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
PlainTextResponse
informació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:
- 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
param
no es 2,HTTPException
se lanza una excepción:
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
- 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