我有一个使用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
response_model
定义中的类类型错误;引用应该指向您的模式(它继承自pydantic的BaseModel
)-您的response_model
指向您的SQLAlchemy模型(即模块名称中的schema
vsmodel
)。