fastapi基本使用之:入参,返回值与异常处理

fastapi针对前后端分离的api操作做了相当多的订制,对于体现在入参、返回值以及异常处理上。

传入的参数可以有三种,路径参数,查询参数以及请求体

参数的自动匹配,类型转换:

传统的web开发,需要开发同学自己从request.GET/POST里按字段去取值,然后自己转换类型。

fastapi直接把这些值取出来,并转到位,尤其是可以生成类(结构体),直接访问就好。

请求体
class Extra(BaseModel):
    message: Union[None, str] = None


# 请求体
class Extra2(BaseModel):
    message2: Union[None, str] = None


# 按约定,username自动识别为path, password自动识别为query
@router.post('/hello/{username}')
def hello(username: str, password: str, data: Extra, data2: Extra2):
    return {
        'username': username,
        'password': password,
        'data': data,
        'data2': data2
    }

常用的基本就够了,还是header参数,cookie参数等,都可以自动匹配取出来。 

这里相比传统的django, flask框架,就是少了从request里读参数,判断类型,数据校验的问题。

下面说说错误处理。

fastapi推荐的HttpException在开发中不太实用,只要是接口正常,http_status_code都是200,然后在返回值里体现:

{
code: 0 服务正常/ -1 一般错误(参数错。。。)/ 1401 认证问题 / .....
msg: '错误描述'
data: 业务返回值可以是json,如 {page:1,count:10,list:[]}
}

 可以拦截RequestValidationError,然后返回我们自定义的反馈,接口状态还是200, 通过

code, message, data来表明具体错误原因。

@app.exception_handler(RequestValidationError)
async def validation_exception_handler(request: Request, exc: RequestValidationError):
    """
    捕获请求参数 验证错误
    :param request:
    :param exc:
    :return:
    """
    # logger.error(f"参数错误\nURL:{request.url}\nHeaders:{request.headers}\n{traceback.format_exc()}")
    # print(traceback.format_exc())
    return JSONResponse(
        status_code=status.HTTP_200_OK,
        content=jsonable_encoder({"code": 10002, "message": "参数不全或参数错误",
                                  "data": {"tip": exc.errors()}, "body": exc.body,
                                  }),
    )

最后是响应模型,通过response_model参数来设定。

通过HelloOut这个模型,可以过滤掉原来的字段,比如原来返回一个user类,要把password过滤掉就特别有用,同样,这个模型里设定的字段默认都是必填的,这就确保接口需要有正确的返回。

class HelloOut(BaseModel):
    username: str
    password: str
    user_id: int


# 按约定,username自动识别为path, password自动识别为query, data, data2自动识别为Body
@router.post('/hello/{username}', response_model=HelloOut)
def hello(uid: int, username: str, password: str, data: Extra, data2: Extra2,
          start_datetime: Union[datetime, None] = Body(default=None),
          ):
    return {
        'uid': uid,
        'username': username,
        'password': password,
        'data': data,
        'data2': data2,
        'start_dt': start_datetime,
        'user_id':123
    }

todo: 这里response_model如果校验错误,会返回500错误,如何拦截下来,并使用我们自定义的response的内容,待补充。

一个接口的基本使用就是这样,相比传统的api开发,就是输入参数不用自己管了,效率高且不容易出错,就是这样。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

AI量化投资实验室

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

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

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

打赏作者

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

抵扣说明:

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

余额充值