fastapi_No.8_响应状态码和处理错误

常见状态码含义

在HTTP协议中,状态码用3位数字表示,其将作为响应的一部分发送给客户端。常用的状态码都有一个与之关联的名称,表示该状态码的含义。
常见的状态码如下:

  • 100及以上状态码用于“消息”响应。很少直接使用它们,此类响应代码的响应不能带有响应体。
  • 200及以上状态码用于“成功”响应。常用
    • 200是默认状态码,它表示一切“正常”。
    • 201表示“已创建”,通常在数据库中创建了一条新记录后使用。
    • 204表示“无内容”,此响应在没有内容返回给客户端时使用,因此该响应不能包含响应体。
  • 300及以上代码用于“重定向”,可能有也可能没有响应体。
    • 304表示“未修改”,该响应不得含有响应体。
  • 400及以上状态码用于“客户端错误”响应。常用
    • 404表示“未找到”
    • 400表示“一般错误”
  • 500及以上状态码用于“服务器端错误”。几乎永远不会直接使用它们。当你的应用程序代码或服务器中的某些部分出现问题时,它将自动返回这些状态代码之一。

路径装饰器中修改状态码

在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":"查无结果"
    }

测试结果如下:
测试结果

错误处理中修改状态码

某些情况下,需要向客户端返回错误提示。
这里所谓的客户端包括前端浏览器、其他应用程序、物联网设备等。
需要向客户端返回错误提示的场景主要如下:

  • 客户端没有执行操作的权限
  • 客户端没有访问资源的权限
  • 客户端要访问的项目不存在
  • 等等。。。
    遇到这些情况时,通常要返回4XX,HTTP状态码。
    4XX状态码表示客户端发生的错误。

HTTPException方式

当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
        }

异常响应结果如下:
错误发生时结果
正常响应结果如下:
正常响应结果

自定义异常处理器

自定义异常处理器主要分为三个步骤:

  1. 创建继承自Exception的子类
  2. 使用@app.exception_handler()添加自定义异常控制器
  3. 使用自定义异常处理器
    后端代码如下:
# 演示自定义异常处理器过程
# 第一步:自定义异常类
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}

测试结果如下:
测试结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

爱学习_程序员

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值