FastAPI 使用HTTPException 来处理请求异常,当客户端请求的资源不存在或者请求的数据存在问题时,可以通过抛出HTTPException异常的方式来响应请求,下面的例子里,如果客户端向获取uid为3的用户信息,服务就会返回404错误
from fastapi import FastAPI, HTTPException
app = FastAPI()
@app.get('/users/{uid}')
def get_user(uid: int):
if uid == 3:
raise HTTPException(status_code=404, detail='用户不存在')
return {"uid": uid}
在浏览器里访问 http://127.0.0.1:8000/users/3 ,得到的响应结果是
{"detail":"用户不存在"}
看一下HTTPException 的定义
class HTTPException(StarletteHTTPException):
def __init__(
self,
status_code: int,
detail: Any = None,
headers: Optional[Dict[str, Any]] = None,
) -> None:
super().__init__(status_code=status_code, detail=detail)
self.headers = headers
HTTPException 可以定义返回的状态码,错误说明,并且可以设置headers,通过HTTPException处理异常虽然简单,但是我们对返回数据内容的控制能力很弱,而且如果有大量的这种处理,也会导致代码变得混乱,为此,FastAPI 还允许你自定义异常处理器。
from fastapi import FastAPI, HTTPException, Request
from fastapi.responses import JSONResponse
app = FastAPI()
class UserNotExistException(Exception):
def __init__(self, uid: int):
self.uid = uid
@app.exception_handler(UserNotExistException)
def user_not_exist_exception_handler(request: Request, exc: UserNotExistException):
data = {
'status': 1,
'msg': f'user {exc.uid} is not exist'
}
return JSONResponse(content=data)
@app.get('/users/{uid}')
def get_user(uid: int):
if uid == 3:
raise UserNotExistException(uid=uid)
return {"uid": uid}
第一步,定义一个异常,继承Exception
第二步,使用exception_handler装饰器定义处理异常的函数
第三步,遇到异常时抛出异常
通过自定义异常,我们可以自定义返回的数据内容,更加自由灵活,在处理异常的函数里,也可以针对异常做一些处理工作,同样的请求,得到的响应结果是
{"status":1,"msg":"user 3 is not exist"}
QQ交流群: 211426309