fastapi--捕捉422报错并进行本地化处理

概述

fastapi如果pydantic对输入数据验证出现不符合的情况,默认情况下会以422的格式返回。
但是说实话这个格式实在是太丑。
最主要的原因是很可能不符合大家前后端交互的错误类型。
当然返回内容不是中文也很重要。(这种事交给前端的话前端大概会打死我)

解决方案

在初始化app的时候,可以增加自定义的报错。
目前fastapi很贴心的支持三种报错捕捉和替换默认处理。

Exception

这种错误就是一般情况下的python报错,这种可以通过捕捉的方式自定义返回值

HTTPException

包括400,401等一般情况下的http错误的处理

RequestValidationError

这就是经典的422报错了,请求参数错误。

解决方案

解决方案放如下(请先跳到重点部分查看)

# -*- encoding: utf-8 -*-
"""
@File    : app.py
@Time    : 2020/12/2 22:57
@Author  : chise
@Email   : chise123@live.com
@Software: PyCharm
@info    :
"""
import json
import logging
import typing

from fastapi import Depends, FastAPI, HTTPException
from fastapi.encoders import jsonable_encoder
from fastapi.exceptions import RequestValidationError
from fastapi.responses import ORJSONResponse
from starlette.requests import Request
from starlette.responses import PlainTextResponse, JSONResponse
from starlette.status import HTTP_401_UNAUTHORIZED, HTTP_403_FORBIDDEN, HTTP_422_UNPROCESSABLE_ENTITY

from example import settings

from example.errors import Forbidden, TokenInvalid, UnKnownError, UserBaned
from example.exceptions import ErrorException, UserBanedError
# from .routes import api_router, notify_router, yl_notify_router
from .views import router

logger = logging.getLogger("example.app1")


async def error_exception_handler(request: Request, exc: ErrorException):
    if isinstance(exc, UserBanedError):
        ret = UserBaned().dict()
        if settings.DEBUG:
            return ORJSONResponse(ret)
        return AesResponse(ret)


async def http_exception_handler(request: Request, exc: HTTPException) -> JSONResponse:
    detial = exc.detail
    if exc.status_code == HTTP_401_UNAUTHORIZED:
        ret = TokenInvalid(msg=exc.detail).dict()
    elif exc.status_code == HTTP_403_FORBIDDEN:
        ret = Forbidden(msg=exc.detail).dict()
    else:
        logger.error(f"HTTPException: {exc.detail}", exc_info=True)
        ret = UnKnownError(msg=exc.detail).dict()
    if settings.DEBUG:
        return JSONResponse(ret)
    return AesResponse(ret)


async def request_validation_exception_handler(
        request: Request, exc: RequestValidationError
) -> JSONResponse:
    """
    捕捉422报错并进行自定义处理
    :param request:
    :param exc:
    :return:
    """
    x = exc.errors()
    return JSONResponse(
        status_code=HTTP_422_UNPROCESSABLE_ENTITY,
        content={"detail": jsonable_encoder(exc.errors())},
    )


class AesResponse(PlainTextResponse):
    def render(self, content: typing.Any) -> bytes:
        """
        返回类,可以在这里进行返回数据全局加密等
        :param content:
        :return:
        """
        content = json.dumps(content)
        self.media_type = "application/json"
        return super(AesResponse, self).render(content)


app = FastAPI(
    title="app1的接口文档",
    debug=settings.DEBUG,
    default_response_class=AesResponse,  # 自定义返回类
)
#重点!!!,通过加入自定义的函数,可以替换默认的报错函数
app.add_exception_handler(ErrorException, error_exception_handler)
app.add_exception_handler(HTTPException, http_exception_handler)
app.add_exception_handler(RequestValidationError, request_validation_exception_handler)
app.include_router(router=router, prefix="/app1")


  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
fastapi-mysql-generator 是一个用于快速生成FastAPI和MySQL的框架的工具。FastAPI是一个现代、快速(高性能)的web框架,而MySQL是一个流行的关系型数据库。 使用 fastapi-mysql-generator,可以从一个简单的命令行界面中生成 FastAPI 应用程序,并与 MySQL 数据库集成。这个工具可以自动创建数据库表和模型(Model),并提供一组 API 端点,用于执行常见的 CRUD(创建、读取、更新和删除)操作。 fastapi-mysql-generator 的主要优势之一是它的简单易用性。无论是初学者还是有经验的开发人员,都可以快速上手并生成一个完整的基于FastAPI和MySQL的应用程序。只需要几个简单的步骤,就可以生成项目的基本结构和代码。同时,fastapi-mysql-generator 还提供了一些配置选项,可以根据需求进行自定义设置,以满足特定的应用程序需求。 这个工具还提供了一些有用的特性,以增强开发的效率和便利性。例如,它可以自动生成 API 文档,包括请求和响应模型的文档说明。此外,fastapi-mysql-generator 还支持身份验证和授权功能,以确保 API 路由的安全性。 总而言之,fastapi-mysql-generator 是一个快速生成 FastAPI 和 MySQL 应用程序的方便工具。它简化了应用程序的开发过程,并提供了一些有用的特性,以提高开发效率和便利性。无论是初学者还是有经验的开发人员,都可以受益于这个工具的使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值