Python?Fastapi實(shí)現(xiàn)統(tǒng)一處理各種異常
在 FastAPI 中處理參數(shù)校驗(yàn)錯(cuò)誤(通常由 Pydantic 模型或路徑參數(shù)校驗(yàn)觸發(fā))需要使用自定義異常處理器捕獲 RequestValidationError。以下是詳細(xì)實(shí)現(xiàn)步驟:
1. 基礎(chǔ)實(shí)現(xiàn)(返回標(biāo)準(zhǔn)錯(cuò)誤結(jié)構(gòu))
from fastapi import FastAPI, Request, status
from fastapi.exceptions import RequestValidationError
from fastapi.responses import JSONResponse
app = FastAPI()
@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
return JSONResponse(
status_code=status.HTTP_422_UNPROCESSABLE_ENTITY,
content={
"code": 422,
"message": "參數(shù)校驗(yàn)失敗",
"errors": exc.errors()
},
)
# 示例路由
@app.get("/items/{item_id}")
async def read_item(item_id: int, q: str):
return {"item_id": item_id, "q": q}
2. 自定義錯(cuò)誤格式(簡(jiǎn)化輸出)
@app.exception_handler(RequestValidationError)
async def custom_validation_handler(request: Request, exc: RequestValidationError):
simplified_errors = []
for error in exc.errors():
# 提取關(guān)鍵信息
simplified_errors.append({
"field": "->".join(str(loc) for loc in error["loc"]), # 錯(cuò)誤字段路徑
"msg": error["msg"],
"type": error["type"]
})
return JSONResponse(
status_code=422,
content={
"error": "ValidationError",
"detail": simplified_errors
}
)
3. 完整示例(含路由演示)
from pydantic import BaseModel, Field
class Item(BaseModel):
name: str = Field(..., min_length=3)
price: float = Field(gt=0)
@app.post("/items/")
async def create_item(item: Item):
return item
# 測(cè)試無(wú)效請(qǐng)求
# curl -X POST 'http://localhost:8000/items/' \
# -H 'Content-Type: application/json' \
# -d '{"name": "AB", "price": -1}'
4. 處理自定義錯(cuò)誤類(lèi)型(擴(kuò)展)
如果需要統(tǒng)一處理其他錯(cuò)誤:
from fastapi import HTTPException
@app.exception_handler(HTTPException)
async def http_exception_handler(request: Request, exc: HTTPException):
return JSONResponse(
status_code=exc.status_code,
content={"error": exc.detail}
)
關(guān)鍵說(shuō)明
1.錯(cuò)誤信息結(jié)構(gòu):
{
"loc": ["body", "price"],
"msg": "ensure this value is greater than 0",
"type": "value_error.number.not_gt"
}
loc:錯(cuò)誤位置(body/query/path/header等 + 字段路徑)msg:人類(lèi)可讀錯(cuò)誤描述type:錯(cuò)誤類(lèi)型標(biāo)識(shí)符
2.HTTP 狀態(tài)碼:
參數(shù)校驗(yàn)錯(cuò)誤通常返回 422 Unprocessable Entity
路徑參數(shù)錯(cuò)誤(如 item_id: int 接收到字符串)會(huì)觸發(fā)相同錯(cuò)誤
3.調(diào)試信息: 生產(chǎn)環(huán)境中建議隱藏詳細(xì)錯(cuò)誤,可通過(guò)環(huán)境變量控制:
import os
@app.exception_handler(RequestValidationError)
async def handler(...):
if os.getenv("ENV") == "prod":
return JSONResponse(status_code=422, content={"error": "Invalid params"})
else:
# 返回完整錯(cuò)誤
測(cè)試驗(yàn)證
使用無(wú)效參數(shù)請(qǐng)求示例路由,將得到類(lèi)似響應(yīng):
{
"code": 422,
"message": "參數(shù)校驗(yàn)失敗",
"errors": [
{
"field": "body->name",
"msg": "ensure this value has at least 3 characters",
"type": "value_error.any_str.min_length"
},
{
"field": "body->price",
"msg": "ensure this value is greater than 0",
"type": "value_error.number.not_gt"
}
]
}
提示:FastAPI 自動(dòng)生成的文檔(Swagger UI)中的參數(shù)校驗(yàn)錯(cuò)誤由內(nèi)置處理器處理,自定義處理器不影響文檔界面行為。
到此這篇關(guān)于Python Fastapi實(shí)現(xiàn)統(tǒng)一處理各種異常的文章就介紹到這了,更多相關(guān)Python Fastapi異常處理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
用sqlalchemy構(gòu)建Django連接池的實(shí)例
今天小編就為大家分享一篇用sqlalchemy構(gòu)建Django連接池的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
python中Celery 異步任務(wù)隊(duì)列的高級(jí)用法
Celery 是一個(gè)高效且可擴(kuò)展的任務(wù)隊(duì)列框架,通過(guò)合理配置任務(wù)重試、分組工作流、優(yōu)先級(jí)管理以及監(jiān)控工具,可以顯著提升系統(tǒng)的可靠性和性能,感興趣的可以了解一下2025-09-09
python2.7的flask框架之引用js&css等靜態(tài)文件的實(shí)現(xiàn)方法
今天小編就為大家分享一篇python2.7的flask框架之引用js&css等靜態(tài)文件的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-08-08
Python圖像處理之Hough變換檢測(cè)直線(xiàn)
霍夫變換是一種特征檢測(cè)(feature?extraction),被廣泛應(yīng)用在圖像分析,本文將利用Hough變換實(shí)現(xiàn)直線(xiàn)檢測(cè),感興趣的小伙伴可以了解一下2023-07-07
使用Python簡(jiǎn)單實(shí)現(xiàn)去除彩色水印
這篇文章主要為大家詳細(xì)介紹了如何使用Python簡(jiǎn)單實(shí)現(xiàn)去除彩色水印效果,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下2025-02-02
Keras實(shí)現(xiàn)Vision?Transformer?VIT模型示例詳解
這篇文章主要為大家介紹了Keras實(shí)現(xiàn)Vision?Transformer?VIT模型示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-05-05
用Python設(shè)計(jì)一個(gè)經(jīng)典小游戲
本篇文章主要介紹如何用Python設(shè)計(jì)一個(gè)經(jīng)典小游戲:猜大小。具有很好的參考價(jià)值。下面跟著小編一起來(lái)看下吧2017-05-05

