在网站前端开发工作时,大多数时间都用于处理表单验证。如果情况涉及前端 - 回复分离,则管理验证消息通信将成为一项麻烦的任务。
出现的问题是:应该在后端或前端管理验证消息吗?
通常,应将消息靠近渲染(主要是前端)接口,以便更好地组织。一种常见的方法是使用与相应消息配对的错误代码。
但是,形式有许多验证方法,如果将错误代码应用于表单,则维护将变得非常具有挑战性。因此,最好通过前端或后端进行集中管理形式式验证。
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"
}
}
这就是它的本质,我为此写了一个包裹。
您可以通过遵守文档来实现这一目标,也鼓励和欢迎捐款。