L�nk?n 2024-06-30 20:56 采纳率: 0%
浏览 8
问题最晚将于07月08日00:00点结题

FastAPI报错: AsyncSession不是有效Pydantic类型

FastAPI项目,采用了异步SQLAlchemy创建数据库链接,返回一个sqlalchemy.ext.asyncio.session.AsyncSession对象

from sqlalchemy.ext.asyncio import AsyncSession

async def get_db():
    async with async_session() as session:
        yield session

然后在路由函数的参数部分声明依赖,省略了函数执行部分代码:


@router.post('/chat', response_model=None,
             responses=responses, dependencies=[Depends(RateLimiter(times=100, seconds=86400))])
async def chat(new_message: MessageToAI,
                       user_identity: UserIdentity = Depends(get_current_user),
                       db: AsyncSession = Depends(get_db)
                       ) -> Any:

我可以确认如下三点:

  1. 已经在路径装饰中声明response_model=None,使FastAPI不自动创建响应类型;
  2. 路由函数部分声明返回任何数据类型 -> Any;
  3. 函数执行部分仅return状态码,不涉及任何AsyncSession类型。

尽管如此,我还是收到报错:

  File "/app/main.py", line 18, in <module>
    from app.routers import user_router, chat_router, auth_router, page_router
  File "/app/routers/chat_router.py", line 37, in <module>
    @router.post('/chat', response_model=None,
     ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
# 省略了部分内容

fastapi.exceptions.FastAPIError: Invalid args for response field! Hint: check that <class 'sqlalchemy.ext.asyncio.session.AsyncSession'> is a valid Pydantic field type. If you are using a return type annotation that is not a valid Pydantic field (e.g. Union[Response, dict, None]) you can disable generating the response model from the type annotation with the path operation decorator parameter response_model=None. Read more: https://fastapi.tiangolo.com/tutorial/response-model/

Process finished with exit code 1

我目前尝试过了通义千问、Kimi、文心一言,给我的建议都是同上述操作1~3,还是不管用。
请给予解答。

  • 写回答

19条回答 默认 最新

  • 阿里嘎多学长 2024-06-30 20:56
    关注

    以下内容由CHATGPT及阿里嘎多学长共同生成、有用望采纳:


    FastAPI 使用 Pydantic 作为数据验证和设置管理库,但是 Pydantic 并不支持所有类型的 Python 对象作为模型字段。在你的情况中,AsyncSession 来自 SQLAlchemy 的异步扩展,并不是一个有效的 Pydantic 模型类型。FastAPI 期望依赖项和响应模型是 Pydantic 模型,以便进行类型检查和数据验证。

    错误信息提示你检查 AsyncSession 是否是一个有效的 Pydantic 字段类型。由于它不是,你需要解决这个问题。以下是一些可能的解决方案:

    1. 不使用 Pydantic 模型作为依赖项类型:你可以将 db 参数的类型从 AsyncSession 改为 Any,这样 FastAPI 就不会尝试将其作为 Pydantic 模型来处理。

      db: Any = Depends(get_db)
      
    2. 自定义响应模型:如果你需要返回一个响应模型,你可以定义一个 Pydantic 模型来表示你的响应数据,而不是使用 Any

    3. 忽略类型检查:如果你确定不需要类型检查,并且只是想避免错误,你可以在路径操作装饰器中设置 response_model=None,你已经这样做了。

    4. 使用前向声明:如果你的 AsyncSession 依赖项类型定义在另一个模块中,确保你已经正确地进行了前向声明。

    5. 检查 FastAPI 和 Pydantic 版本:确保你使用的 FastAPI 和 Pydantic 版本兼容,有时候更新到最新版本可以解决一些兼容性问题。

    6. 查看 FastAPI 文档:FastAPI 的官方文档提供了关于如何正确使用依赖项和响应模型的详细信息。你可以查看 FastAPI 依赖项文档Pydantic 模型文档 来获取更多信息。

    7. 社区和论坛:如果上述方法都不能解决问题,你可以查看 FastAPI 的 GitHub 问题跟踪器或相关社区论坛,看看是否有其他人遇到了类似的问题,并找到了解决方案。

    请尝试上述建议,并根据你的具体情况选择最合适的解决方案。如果问题仍然存在,提供更多的代码上下文可能会有助于进一步诊断问题。

    评论 编辑记录

报告相同问题?

问题事件

  • 创建了问题 6月30日

悬赏问题

  • ¥15 求修改代码,图书管理系统
  • ¥15 请问有没求偏多标签数据集yeast,reference,recreation,scene,health数据集。
  • ¥15 传感网应用开发单片机实训
  • ¥15 Delphi 关于sAlphaImageList使用问题
  • ¥15 寻找将CAJ格式文档转txt文本的方案
  • ¥20 数电设计提问求帮助,出租车计费器
  • ¥15 shein测试开发会问些啥我是写java的
  • ¥15 关于#单片机#的问题:我有个课程项目设计,我想在STM32F103veTX单片机,M3主控模块上设计一个程序,在Keil uVision5(C语言)上代码该怎么编译?(嫌钱少我可以加钱,急急急)
  • ¥15 opnet仿真网络协议遇到问题
  • ¥15 在安装python的机器学习程序包scikit-learn(1.1版本)时遇到如下问题