赞
踩
在HTTP协议中,状态码用3位数字表示,其将作为响应的一部分发送给客户端。常用的状态码都有一个与之关联的名称,表示该状态码的含义。
常见的状态码如下:
在fastapi中主要有两个地方修改状态码,一处在路径修饰器中,另一处在错误处理中。
在路径修饰器中修改状态码,表示路径操作函数正常结束后,服务器端向客户端发送的响应状态码。
响应状态码即可以通过直接书写数字实现,也可以通过fastapi中status下的枚举类型实现。
后端代码如下:
# 第一步:导入FastAPI类
from fastapi import FastAPI
# 第二步:创建FastAPI示例对象
app = FastAPI()
# 第三步:创建路径修饰器
# 演示默认响应状态码
@app.get("/item")
# 第四步:创建路径操作函数
async def get_item():
return {"msg":"请求成功"}
# 第五步:运行服务器
if __name__ == "__main__":
import uvicorn
uvicorn.run(app="main:app",host="127.0.0.1",port=8080,reload=True)
测试结果如下:默认成功时响应状态码为200
通常情况下响应成功时响应状态码是200。这里我们演示将成功响应时状态码修改为201.
后端代码如下:
# 演示将成功响应时状态码改为其它
# 演示通过数字方式修改状态码
from fastapi import Body
@app.post("/item",status_code=201)
async def create_item(user=Body(),pwd=Body()):
users = []
users.append({"username":user,"pwd":pwd})
return {
"result":"create successfully"
}
测试结果如下:
这里通过fastapi中status下的枚举值来修改成功响应状态码。
后端代码如下:
# 演示通过枚举方式修改状态码
# 从fastapi包中引入status,用来修改成功响应时状态码
from fastapi import status
# 此处虽然使用了400状态码,但是浏览器依旧能够得到结果。说明此处的状态码只要路径操作函数成功执行完都会得到此处的状态码
@app.patch("/item",status_code=status.HTTP_400_BAD_REQUEST)
async def update_item(name:str=Body(),price:float=Body()):
return {
"result":"查无结果"
}
测试结果如下:
某些情况下,需要向客户端返回错误提示。
这里所谓的客户端包括前端浏览器、其他应用程序、物联网设备等。
需要向客户端返回错误提示的场景主要如下:
当HTTP请求时客户端发生错误,可以认为发生了一个异常。此时可以通过提交一个异常,并在异常中设置状态码,完成状态码的修改。
在fastapi中,主要通过HTTPException异常来实现。
后端代码如下:
# 演示通过HTTPException来修改错误发生时状态码
# 从fastapi中引入HTTPException类表示异常
from fastapi import HTTPException
@app.get("/items/{item_id}")
async def get_items(item_id:int=0):
if item_id == 3:
# status_code表示响应码,detail表示发生异常时响应的JSON格式内容
raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,detail="Don't have this item_id ")
else:
return {
"item_id":item_id
}
异常响应结果如下:
正常响应结果如下:
自定义异常处理器主要分为三个步骤:
# 演示自定义异常处理器过程 # 第一步:自定义异常类 class MyException(Exception): def __init__(self, name: str) -> None: self.name = name # 第二步:添加自定义异常控制器 # 导入Request是表示HTTP请求的类 # 导入JSONResponse是表示HTTP是JSON格式响应 # 导入这两个类用于添加自定义异常控制器 from fastapi import Request from fastapi.responses import JSONResponse # 创建一个异常处理器 @app.exception_handler(MyException) # 创建异常处理器操作函数,此处形参一个为请求,另一个为自定义异常类! # 异常处理器操作函数体中声明,状态码,响应信息和其他处理逻辑 async def myexception_handler(req:Request,exc:MyException): return JSONResponse( status_code=status.HTTP_401_UNAUTHORIZED, content={ "message":f"{exc.name} is not allowed" } ) # 第三步:使用自定义异常处理器 from fastapi import Query @app.get("/student/") async def get_stu(name:str=Query()): if name == "test": raise MyException(name=name) else: return { "name":name }
测试结果如下:
fastapi自带一些默认异常处理器。
触发HTTPException或请求无效数据时,这些处理器返回默认的JSON响应结果。
可以使用自定义处理器覆盖默认异常处理器。
意思就是重新定义默认异常类的异常处理器操作函数。
后端代码如下:
# 演示覆盖默认异常处理器,主要使用是重新定义异常处理器操作函数 # 演示覆盖HTTPException JSON格式回复给文本回复 # 引入fastapi中的PlainTextResponse是为了修改异常回复格式为文本 from fastapi.responses import PlainTextResponse @app.exception_handler(HTTPException) # 重新定义HTTPException异常处理器的操作函数 async def http_exception_handler(req,exc): return PlainTextResponse( status_code=exc.status_code, content=str(exc.detail) ) @app.get("/student/{stu_id}") async def get_stu(stu_id:int = 0): if stu_id == 3: raise HTTPException(status_code=418,detail="Not 3") return {"stu_id":stu_id}
测试结果如下:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。