error message with i18n support in FastAPI
## response example
```json
{
"errors": [
{
"loc": [
"body",
"string"
],
"msg": "確保此值最多有 10 個字符",
"type": "value_error.any_str.max_length",
"ctx": {
"limit_value": 10
}
},
{
"loc": [
"body",
"nested",
"body"
],
"msg": "確保此值最多有 2 個字符",
"type": "value_error.any_str.max_length",
"ctx": {
"limit_value": 2
}
},
{
"loc": [
"body",
"nested",
"inner",
"inner_body"
],
"msg": "確保此值最多包含 2 個項目",
"type": "value_error.list.max_items",
"ctx": {
"limit_value": 2
}
},
{
"loc": [
"body",
"nested",
"inner",
"cat"
],
"msg": "鑑別器 'color' 和值 'ccc' 不匹配(允許的值: 'black', 'white')",
"type": "value_error.discriminated_union.invalid_discriminator",
"ctx": {
"discriminator_key": "color",
"discriminator_value": "ccc",
"allowed_values": "'black', 'white'"
}
}
]
}
```
## parameters
all parameters are optional
| param | description | default |
|-------------------|----------------------------------------------------------------------------------|-----------------------------|
| locale_path | the path of your locale files | locales |
| locale_list | support locales in your app in tuple | ('zh-TW', 'ja-JP', 'en-US') |
| bind_to_life_span | set to `True` if you want the translator instance be created when on app startup | False |
## Attention
- For FastAPI >=0.100.0 and pydantic v2, please use **^0.4.0**
- For FastAPI < 0.100.0 nad pydantic v1, please use **^0.3.0**
- built-in locales are **zh-TW, en-US, ja-JP**, you can change the locales by yourself
## How to run
- use `setup`
```py
from fastapi_validation_i18n import setup
from fastapi import FastAPI
app = FastAPI()
setup(app, locale_path=..., locale_list=...)
```
- use middleware and exception handler
```py
from fastapi import FastAPI
from fastapi_validation_i18n import I18nMiddleware, i18n_exception_handler
from fastapi.exceptions import RequestValidationError
app = FastAPI()
app.add_middleware(I18nMiddleware, locale_path='your-publish-path')
app.add_exception_handler(
RequestValidationError,
i18n_exception_handler
)
```
## Other
- publish locales to your app path
```bash
# default to "locale" in your project path
poetry run publish-locale <your-path> [--locale]
```
- how to set locale
there are 3 ways to set locale
1. set `accept-language` header to your request
2. set an API with `locale` in path
3. set `locale` query parameter to your request
you can see the [example](https://github.com/whchi/fastapi-validation-i18n/tree/main/example) for more detail
Raw data
{
"_id": null,
"home_page": null,
"name": "fastapi-validation-i18n",
"maintainer": null,
"docs_url": null,
"requires_python": ">=3.8",
"maintainer_email": null,
"keywords": "fastapi, i18n, pydantic, validation",
"author": null,
"author_email": "whchi <whccchi@gmail.com>",
"download_url": "https://files.pythonhosted.org/packages/28/18/c1c5bc632dc3bcba627d818469f11fbbdbef058203d640cbe64507cf5c4d/fastapi_validation_i18n-0.4.2.tar.gz",
"platform": null,
"description": "error message with i18n support in FastAPI\n## response example\n```json\n{\n \"errors\": [\n {\n \"loc\": [\n \"body\",\n \"string\"\n ],\n \"msg\": \"\u78ba\u4fdd\u6b64\u503c\u6700\u591a\u6709 10 \u500b\u5b57\u7b26\",\n \"type\": \"value_error.any_str.max_length\",\n \"ctx\": {\n \"limit_value\": 10\n }\n },\n {\n \"loc\": [\n \"body\",\n \"nested\",\n \"body\"\n ],\n \"msg\": \"\u78ba\u4fdd\u6b64\u503c\u6700\u591a\u6709 2 \u500b\u5b57\u7b26\",\n \"type\": \"value_error.any_str.max_length\",\n \"ctx\": {\n \"limit_value\": 2\n }\n },\n {\n \"loc\": [\n \"body\",\n \"nested\",\n \"inner\",\n \"inner_body\"\n ],\n \"msg\": \"\u78ba\u4fdd\u6b64\u503c\u6700\u591a\u5305\u542b 2 \u500b\u9805\u76ee\",\n \"type\": \"value_error.list.max_items\",\n \"ctx\": {\n \"limit_value\": 2\n }\n },\n {\n \"loc\": [\n \"body\",\n \"nested\",\n \"inner\",\n \"cat\"\n ],\n \"msg\": \"\u9451\u5225\u5668 'color' \u548c\u503c 'ccc' \u4e0d\u5339\u914d\uff08\u5141\u8a31\u7684\u503c: 'black', 'white'\uff09\",\n \"type\": \"value_error.discriminated_union.invalid_discriminator\",\n \"ctx\": {\n \"discriminator_key\": \"color\",\n \"discriminator_value\": \"ccc\",\n \"allowed_values\": \"'black', 'white'\"\n }\n }\n ]\n}\n```\n## parameters\nall parameters are optional\n\n| param | description | default |\n|-------------------|----------------------------------------------------------------------------------|-----------------------------|\n| locale_path | the path of your locale files | locales |\n| locale_list | support locales in your app in tuple | ('zh-TW', 'ja-JP', 'en-US') |\n| bind_to_life_span | set to `True` if you want the translator instance be created when on app startup | False |\n\n## Attention\n- For FastAPI >=0.100.0 and pydantic v2, please use **^0.4.0**\n- For FastAPI < 0.100.0 nad pydantic v1, please use **^0.3.0**\n- built-in locales are **zh-TW, en-US, ja-JP**, you can change the locales by yourself\n\n## How to run\n- use `setup`\n```py\nfrom fastapi_validation_i18n import setup\nfrom fastapi import FastAPI\napp = FastAPI()\nsetup(app, locale_path=..., locale_list=...)\n\n```\n- use middleware and exception handler\n```py\nfrom fastapi import FastAPI\nfrom fastapi_validation_i18n import I18nMiddleware, i18n_exception_handler\nfrom fastapi.exceptions import RequestValidationError\n\napp = FastAPI()\n\napp.add_middleware(I18nMiddleware, locale_path='your-publish-path')\n\napp.add_exception_handler(\n RequestValidationError,\n i18n_exception_handler\n)\n```\n## Other\n- publish locales to your app path\n```bash\n# default to \"locale\" in your project path\npoetry run publish-locale <your-path> [--locale]\n```\n\n- how to set locale\n\nthere are 3 ways to set locale\n1. set `accept-language` header to your request\n2. set an API with `locale` in path\n3. set `locale` query parameter to your request\n\nyou can see the [example](https://github.com/whchi/fastapi-validation-i18n/tree/main/example) for more detail\n",
"bugtrack_url": null,
"license": null,
"summary": "FastAPI request validation with i18n error message",
"version": "0.4.2",
"project_urls": {
"Repository": "https://github.com/whchi/fastapi-validation-i18n"
},
"split_keywords": [
"fastapi",
" i18n",
" pydantic",
" validation"
],
"urls": [
{
"comment_text": "",
"digests": {
"blake2b_256": "290ba9d65189fe9ed1d155f513b12acb5bb8920f36917482b0c5eff2ab216020",
"md5": "45f61baf91c4f0fdba14cd12b1e0c9d4",
"sha256": "a6f61cd2de84858b78dd59dca882fabee2904e9dd0042a8dc3ff2b32da870135"
},
"downloads": -1,
"filename": "fastapi_validation_i18n-0.4.2-py3-none-any.whl",
"has_sig": false,
"md5_digest": "45f61baf91c4f0fdba14cd12b1e0c9d4",
"packagetype": "bdist_wheel",
"python_version": "py3",
"requires_python": ">=3.8",
"size": 16665,
"upload_time": "2024-04-02T07:24:04",
"upload_time_iso_8601": "2024-04-02T07:24:04.419470Z",
"url": "https://files.pythonhosted.org/packages/29/0b/a9d65189fe9ed1d155f513b12acb5bb8920f36917482b0c5eff2ab216020/fastapi_validation_i18n-0.4.2-py3-none-any.whl",
"yanked": false,
"yanked_reason": null
},
{
"comment_text": "",
"digests": {
"blake2b_256": "2818c1c5bc632dc3bcba627d818469f11fbbdbef058203d640cbe64507cf5c4d",
"md5": "44a57ca2119c09a4aff0266f8dd9b1b7",
"sha256": "aa3cb9353c7d449c70735621582052da8df632eaf4b2f6de2211186bf3373170"
},
"downloads": -1,
"filename": "fastapi_validation_i18n-0.4.2.tar.gz",
"has_sig": false,
"md5_digest": "44a57ca2119c09a4aff0266f8dd9b1b7",
"packagetype": "sdist",
"python_version": "source",
"requires_python": ">=3.8",
"size": 40792,
"upload_time": "2024-04-02T07:24:06",
"upload_time_iso_8601": "2024-04-02T07:24:06.069179Z",
"url": "https://files.pythonhosted.org/packages/28/18/c1c5bc632dc3bcba627d818469f11fbbdbef058203d640cbe64507cf5c4d/fastapi_validation_i18n-0.4.2.tar.gz",
"yanked": false,
"yanked_reason": null
}
],
"upload_time": "2024-04-02 07:24:06",
"github": true,
"gitlab": false,
"bitbucket": false,
"codeberg": false,
"github_user": "whchi",
"github_project": "fastapi-validation-i18n",
"travis_ci": false,
"coveralls": false,
"github_actions": true,
"lcname": "fastapi-validation-i18n"
}