前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >FastAPI 学习之路(十九)处理错误

FastAPI 学习之路(十九)处理错误

作者头像
雷子
发布2021-08-25 10:11:14
9600
发布2021-08-25 10:11:14
举报
文章被收录于专栏:雷子说测试开发

FastAPI 系列文章:

FastAPI 学习之路(一)

FastAPI 学习之路(二)

FastAPI 学习之路(三)

FastAPI 学习之路(四)使用pydantic模型做请求体

FastAPI 学习之路(五)

FastAPI 学习之路(六)

FastAPI 学习之路(七)

FastAPI 学习之路(八)

FastAPI 学习之路(九)

FastAPI 学习之路(十)

FastAPI 学习之路(十一)

FastAPI 学习之路(十二)额外数据类型

FastAPI 学习之路(十三)Cookie 参数,Header参数

FastAPI 学习之路(十四)响应模型

FastAPI 学习之路(十五)响应状态码

FastAPI 学习之路(十六)Form表单

FastAPI 学习之路(十七)上传文件

FastAPI 学习之路(十八)表单与文件

前言

我们之前分享的是表单和文件组合使用。我们这次看下处理错误。

正文

某些情况下,需要向客户端返回错误提示。

这里所谓的客户端包括前端浏览器、其他应用程序、物联网设备等。

需要向客户端返回错误提示的场景主要如下:

  • 客户端没有执行操作的权限
  • 客户端没有访问资源的权限
  • 客户端要访问的项目不存在
  • 等等 ...

遇到这些情况时,通常要返回 4XX(400 至 499)HTTP 状态码

4XX 状态码与表示请求成功的 2XX(200 至 299) HTTP 状态码类似。

只不过,4XX 状态码表示客户端发生的错误。

如何处理呢,我们通过一段代码来演示

代码语言:javascript
复制
from fastapi import FastAPI, HTTPException
app = FastAPI()
items = {"test": "雷子说测试开发"}
@app.get("/items/{item_id}")
def read_item(item_id: str):
    if item_id not in items:
        raise HTTPException(status_code=404, detail="Item not found")
    return {"item": items[item_id]}

我们看下接口的返回

这是正常的接口返回,我们来看下我们错误的异常返回

我们可以看到这个时候可以正常返回,但是我们的状态码已经被我们改成404了。

HTTPException 是额外包含了和 API 有关数据的常规 Python 异常。

因为是 Python 异常,所以不能 return,只能 raise。

如在调用路径操作函数里的工具函数时,触发了 HTTPException,FastAPI 就不再继续执行路径操作函数中的后续代码,而是立即终止请求,并把 HTTPException 的 HTTP 错误发送至客户端。

响应结果

请求为 http://example.com/items/test(item_id 为 test)时,客户端会接收到 HTTP 状态码 - 200 及如下 JSON 响应结果:

代码语言:javascript
复制
{
    "item": "雷子说测试开发"
}

但如果客户端请求 http://example.com/items/test1(item_id 为test1 不存在时),则会接收到 HTTP 状态码 - 404(「未找到」错误)及如下 JSON 响应结果:

代码语言:javascript
复制
{
"detail": "Item not found"
}
    触发 HTTPException 时,可以用参数 detail 传递任何能转换为 JSON 的值,不仅限于 str。
还支持传递 dict、list 等数据结构。
FastAPI 能自动处理这些数据,并将之转换为 JSON。
添加自定义响应头
有些场景下要为 HTTP 错误添加自定义响应头。例如,出于某些方面的安全需要。
我们看下如何自定义响应头
from fastapi import FastAPI, HTTPException

app = FastAPI()

items = {"test": "雷子说测试开发"}


@app.get("/items/{item_id}")
def read_item(item_id: str):
    if item_id not in items:
        raise HTTPException(status_code=404, detail="Item not found",
                            headers={"X-Error": "NADOR"},
                            )
    return {"item": items[item_id]}
结果如下:

    

我们还可以去自定义我们的异常处理器。我们看下如何来实现的。 from fastapi import FastAPI, Request from fastapi.responses import JSONResponse class UnicornException(Exception): def __init__(self, name: str): self.name = name app = FastAPI() @app.exception_handler(UnicornException) async def unicorn_exception_handler(request: Request, exc: UnicornException): return JSONResponse( status_code=408, content={"message": f"Oops! {exc.name} "}, ) @app.get("/one/{name}") async def one(name: str): if name == "leizi": raise UnicornException(name=name) return {"name": name} 我们可以看到,我们的实现其实很简单。用 @app.exception_handler () 即可添加自定义异常控制器。 我们请求下,当我们的名称等于雷子的时候,就是返回我们自定义的异常。

正常的请求

那么就可以看到,我们去实现的自定义的异常是成功的。

FastAPI 自带了一些默认异常处理器。

触发 HTTPException 或请求无效数据时,这些处理器返回默认的 JSON 响应结果。

不过,也可以使用自定义处理器覆盖默认异常处理器。

后记

发现问题,解决问题。遇到问题,慢慢解决问题即可。

欢迎关注雷子说测试开发,后续将会持续为大家分享更多的技术知识

如果你有问题可以留言或者加我微信:952943386。2021,一起牛转钱坤,一起牛逼。

如果觉得这篇文章还不错,来个【分享、点赞、在看】三连吧,让更多的人也看到~

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-08-13,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 雷子说测试开发 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • FastAPI 系列文章:
    • 响应结果
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档