当前位置: 首页 > 知识库问答 >
问题:

在FastApi中切换到路由器并不顺利。response_modelList[]pydant字段类型错误

梁丘洲
2023-03-14

我有一个使用FastApi的Python 3.8应用程序。< code>main.py中的路由越来越多,所以我采用了从FastApi application对象切换到< code>router的方法,并将每个db表的路由放在自己的文件中。到目前为止,由于对< code>response_model装饰器的解释,它还没有工作。

开关导致我修改后的代码与response_model装饰器Post有麻烦。最大的区别是我使用的是router装饰器,而不是main中的应用程序装饰器。

我得到的具体错误是:

 File "/Users/markwardell/PycharmProjects/pythonProject/venv/lib/python3.8/site-packages/fastapi/utils.py", line 67, in create_response_field
    raise fastapi.exceptions.FastAPIError(
fastapi.exceptions.FastAPIError: Invalid args for response field! Hint: check that typing.List[models.Post] is a valid pydantic field type

导致此错误的代码在post.py中,我从main.py

post.py

从fastapi导入HTTPException,从sqlalchemy导入APIRouter。form import Session从fastapi键入import List。params导入依赖

import models
from database import get_db

router: APIRouter = APIRouter()


@router.get("/postss", response_model=List[models.Post])
def get_post(db: Session = Depends(get_db)):
    # cursor.execute("""SELECT * FROM posts""")
    # posts = cursor.fetchall()
    # print(posts)

    try:
        posts = db.query(models.Post).all()
    except Exception as ex:
        msg = f"Unexpected {ex=}, {type(ex)=}"
        raise HTTPException(status_code=500, detail=msg)
    return posts

工作的原始代码:

main.py

从Fastapi导入FastAPI、响应、HTTP异常从fastapi.params导入取决于从starlette导入状态导入用户导入帖子

import models
import schemas
from database import engine, get_db
from sqlalchemy.orm import Session

models.Base.metadata.create_all(bind=engine)


app = FastAPI()
app.include_router(user.router)
app.include_router(post.router)

if __name__ == "__main__":
    uvicorn.run(app, host="127.0.0.1", port=8000)


@app.get("/")
async def root():
    return {"message": "Welcome To My Api!"}


@app.get("/posts", response_model=List[schemas.Post])
def get_posts(db: Session = Depends(get_db)):
    # cursor.execute("""SELECT * FROM posts""")
    # posts = cursor.fetchall()
    # print(posts)

    try:
        posts = db.query(models.Post).all()
    except Exception as ex:
        msg = f"Unexpected {ex=}, {type(ex)=}"
        raise HTTPException(status_code=500, detail=msg)
    return posts

以下是response_model的定义

schema.py

from datetime import datetime

from pydantic import BaseModel, EmailStr


class PostBase(BaseModel):
    title: str
    content: str
    published: bool = True


class PostCreate(BaseModel):
    pass


class Post(PostBase):
    id: int
    created_at: datetime

    class Config:
        orm_mode = True
        arbitrary_types_allowed = True


class UserCreate(BaseModel):
    email: EmailStr
    password: str


class UserOut(BaseModel):
    id: int
    email: EmailStr
    created_at: datetime

    class Config:
        orm_mode = True

共有1个答案

符俊材
2023-03-14

response_model定义中的类类型错误;引用应该指向您的模式(它继承自pydantic的BaseModel)-您的response_model指向您的SQLAlchemy模型(即模块名称中的schemavsmodel)。

 类似资料:
  • 我将Camel与Spring Boot一起使用。在基本上记录消息正文的服务路由实现过程中,我看到了如下所示的错误。 我的路线是: 我在日志正文行中出现错误。 我的问题是预期的行为?为什么Camel不只是调用对象的方法。如果这是预期的行为,那么我需要一个字符串转换器来处理每个新的复杂类型?

  • 我已经使用graphql-tools缝合了两个graphqlendpoint。对于一个endpoint模式,它工作得很好,但对于另一个模式,它抛出了这个错误“GraphQlError:field not found in type:'query_root'”。即使我可以在自省的时候看到所有的模式。

  • 考虑以下事项: 我有一个应用模板,一个HeaderTemboard,和参数化的路由集与相同的处理程序(在应用模板)。我希望在没有找到东西的时候能够服务404路线。例如, /CA/SanFrancisco应该由区域查找和处理,而 /SanFranciscoz应该是404。 下面是我如何快速测试路线的。 问题是 /SanFranciscoz总是由区域页面处理,但我希望它是404。此外,如果我向第一个路

  • 我有以下路由器和路由使用反应路由器中继包 GraphQL中的My StoreType如下所示,用户字段接受表示非空整数的id参数: 路由的我的中继容器: 当我在浏览器中访问 /user/1时,react-router-中继将视为路由中的字符串而不是整数,并且GraphQL返回JSON编码的错误消息 有没有办法将URL中传递的userId参数转换为整数?或者是否有支持格式良好的数字字符串和整数的自定

  • 我是react with typescript的初学者,在下面的代码中面临问题 下面是仪表板组件的代码 这是路线代码 在路线代码中,我面临类型问题,即。 E:/Web/src/router/route中的TypeScript错误。tsx(18,51): 没有重载匹配此调用。 重载1 of 2,'(props: ReadOnly): Road',给出以下错误。键入{Dashboard: string

  • 我正在使用akka超文本传输协议设置一个rest控制器。控制器解析url,提取变量,然后调用一个服务,该服务向参与者发送消息,然后参与者查询存储库并将数据作为消息发送。我最终让参与者接收消息并查询回购(在不得不链接一系列期货之后),但现在我在控制器中遇到了一个我无法理解的错误: 这是否意味着我必须在其他地方包含一个完整的()。 我试图确保参与者发送一个未来作为其消息的内容,并且服务向控制器返回一个