本地化您的FastAPI验证消息
#网络开发人员 #python #fastapi

在网站前端开发工作时,大多数时间都用于处理表单验证。如果情况涉及前端 - 回复分离,则管理验证消息通信将成为一项麻烦的任务。

出现的问题是:应该在后端或前端管理验证消息吗?

通常,应将消息靠近渲染(主要是前端)接口,以便更好地组织。一种常见的方法是使用与相应消息配对的错误代码。

但是,形式有许多验证方法,如果将错误代码应用于表单,则维护将变得非常具有挑战性。因此,最好通过前端或后端进行集中管理形式式验证。

fastapi 采用 pydantic 封装表单验证的大多数方案并提供相应的错误消息。这在纯粹的英语环境中效果很好,但是如果我们需要国际化(I18N),很明显,这种方法不足。

本文将通过如何将I18N集成到FastAPI的请求验证错误消息与伪代码的整个概念中发挥作用。

中间件

首先,我们需要知道它是什么地方,我们可以使用中间件来存档

class LocaleMiddleware:
   async def dispatch(req, call_next):
       req.locale = incoming_locale
       return await call_next(req)
app.add_middleware(LocaleMiddleware)

例外处理程序

然后我们注册自己的异常处理程序来处理RequestValidationError

async def i18n_exception_handler(request, exc):
     msg = make_i18n_msg(exc, request.state.locale)
     return JSONResponse({"errors": exc}, status=422)

app.add_exception_handler(RequestValidationError, i18n_exception_handler)

翻译

最后,我们进行了翻译动作,FastApi的Exc是对象的对象,因此我们需要递归提取消息

def make_i18n_msg(exc, locale):
   if isinstanceof(exc, wrapper):
     return make_i18n_msg(exc, locale)
   return Translator(locale).t('trans.file.key')

我们需要一个翻译文件看起来像

// zh-TW.json
{
  "field required": "欄位必填",
  "extra fields not permitted": "不允許額外的欄位",
}
// ja-JP.json
{
  "field required": "フィールドは必須です",
  "extra fields not permitted": "余分なフィールドは許可されていません",
}

然后,当您将语言环境发送到API Pydantic验证时,您将获得类似
的东西

{
  "errors": [
    {
      "loc": [
        "body",
        "string"
      ],
      "msg": "フィールドは必須です",
      "type": "value_missing.field_required"
    },
   {
      "loc": [
        "body",
        "string"
      ],
      "msg": "余分なフィールドは許可されていません",
      "type": "value_error.extra_fields_are_not_permitted"
    }
}

这就是它的本质,我为此写了一个包裹。

fastapi-validation-i18n

您可以通过遵守文档来实现这一目标,也鼓励和欢迎捐款。