FastAPI 与 Pydantic 版本兼容问题导致 `/docs` 报错 500 的解决方案

FastAPI 与 Pydantic 版本兼容问题导致 /docs 报错 500 的解决方案

在使用 FastAPI 开发接口时,遇到访问自动生成的 API 文档(/docs)时报错:


Fetch error
Internal Server Error /openapi.json

或日志中出现类似的:


ERROR:    Exception in ASGI application
Traceback (most recent call last):
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\uvicorn\protocols\http\httptools_impl.py", line 409, in run_asgi
    result = await app(  # type: ignore[func-returns-value]
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\uvicorn\middleware\proxy_headers.py", line 60, in __call__
    return await self.app(scope, receive, send)
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\fastapi\applications.py", line 1054, in __call__
    await super().__call__(scope, receive, send)
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\starlette\applications.py", line 112, in __call__
    await self.middleware_stack(scope, receive, send)
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\starlette\middleware\errors.py", line 187, in __call__
    raise exc
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\starlette\middleware\errors.py", line 165, in __call__
    await self.app(scope, receive, _send)
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\starlette\middleware\exceptions.py", line 62, in __call__
    await wrap_app_handling_exceptions(self.app, conn)(scope, receive, send)
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\starlette\routing.py", line 714, in __call__
    await self.middleware_stack(scope, receive, send)
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\starlette\routing.py", line 734, in app
    await route.handle(scope, receive, send)
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\starlette\routing.py", line 288, in handle
    await self.app(scope, receive, send)
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\starlette\routing.py", line 76, in app
    await wrap_app_handling_exceptions(app, request)(scope, receive, send)
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\starlette\_exception_handler.py", line 53, in wrapped_app
    raise exc
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\starlette\_exception_handler.py", line 42, in wrapped_app
    await app(scope, receive, sender)
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\starlette\routing.py", line 73, in app
    response = await f(request)
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\fastapi\applications.py", line 1009, in openapi
    return JSONResponse(self.openapi())
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\fastapi\applications.py", line 981, in openapi
    self.openapi_schema = get_openapi(
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\fastapi\openapi\utils.py", line 513, in get_openapi
    schema_generator = GenerateJsonSchema(ref_template=REF_TEMPLATE)
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\pydantic\json_schema.py", line 278, in __init__
    self._schema_type_to_method = self.build_schema_type_to_method()
  File "D:\software\miniconda3\envs\pyfastapi\lib\site-packages\pydantic\json_schema.py", line 317, in build_schema_type_to_method
    method_name = f'{key.replace("-", "_")}_schema'
  File "D:\software\miniconda3\envs\pyfastapi\lib\typing.py", line 647, in __getattr__
    return getattr(self.__origin__, attr)
AttributeError: '_SpecialForm' object has no attribute 'replace'

这是因为 FastAPI 与 Pydantic 版本不兼容引起的。本文将详细介绍问题成因及解决方法。


问题背景

  • FastAPI 是基于 Pydantic 进行数据校验与模型定义的框架。
  • Pydantic 2.x 对类型系统和 JSON Schema 生成进行了重大升级。
  • FastAPI 0.115.13 是当前最新稳定版本,官方已支持 Pydantic 2.x,但早期 FastAPI 版本对部分 Pydantic 2.x 版本兼容不完善。

错误原因

  • 当 Pydantic 版本过高(如 2.11.7)而 FastAPI 版本较旧时,FastAPI 内部调用 Pydantic 的 JSON Schema 生成方法可能失败。
  • 报错日志通常包含:

AttributeError: '\_SpecialForm' object has no attribute 'replace'

这说明 FastAPI 期望 Pydantic 返回的类型信息格式与实际不符,导致 OpenAPI Schema 生成失败。


解决方案

降级 Pydantic(亲测有效)

将 Pydantic 版本降到与 FastAPI 兼容的稳定版本,例如:

pip install pydantic==2.10.6

该版本在实测中与 FastAPI 0.115.13 兼容良好,解决了 /docs 报错问题。


总结

访问 FastAPI 自动生成文档 /docs 报错,绝大多数是 FastAPI 与 Pydantic 版本兼容问题导致的。调整 Pydantic 版本,降级到 2.10.6,配合 FastAPI 0.115.13 使用,基本能解决此问题。


posted @ 2025-06-26 10:32  LgRun  阅读(353)  评论(0)    收藏  举报