FastAPI“put”和“patch”方法不起作用,并给出错误500

2024-04-29 02:33:15 发布

您现在位置:Python中文网/ 问答频道 /正文

我是FastAPI的新手,我被FastAPI的put方法卡住了。我正在遵循某个教程。 代码如下:

@app.put("/blog/{blog_id}", status_code=status.HTTP_202_ACCEPTED)
def update(blog_id: int, request: schemas.Blog,
           db: Session = Depends(get_db)):
    blog = db.query(models.Blog).filter(models.Blog.id == blog_id)
    if blog.first() is None:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,
                            detail="Blog not found")
    blog.update(request, synchronize_session=False)
    db.commit()
    return 'Blog updated'


@app.patch("/blog/{blog_id}", status_code=status.HTTP_202_ACCEPTED)
def partial_update(blog_id: int, request: schemas.Blog,
                   db: Session = Depends(get_db)):
    blog = db.query(models.Blog).filter(models.Blog.id == blog_id)
    if blog.first() is None:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND,
                            detail="Blog not found")
    blog.update(request, synchronize_session=False)
    db.commit()
    return 'Blog updated'

但问题是它没有更新内容,如果我尝试更新它,它会给出错误500。 在控制台中显示以下错误:

File "/home/satvir/Documents/dev/FastApi_Tutorial/.env/lib/python3.9/site-packages/starlette/middleware/errors.py", line 159, in __call__
    await self.app(scope, receive, _send)
  File "/home/satvir/Documents/dev/FastApi_Tutorial/.env/lib/python3.9/site-packages/starlette/exceptions.py", line 82, in __call__
    raise exc from None
  File "/home/satvir/Documents/dev/FastApi_Tutorial/.env/lib/python3.9/site-packages/starlette/exceptions.py", line 71, in __call__
    await self.app(scope, receive, sender)
  File "/home/satvir/Documents/dev/FastApi_Tutorial/.env/lib/python3.9/site-packages/starlette/routing.py", line 566, in __call__
    await route.handle(scope, receive, send)
  File "/home/satvir/Documents/dev/FastApi_Tutorial/.env/lib/python3.9/site-packages/starlette/routing.py", line 227, in handle
    await self.app(scope, receive, send)
  File "/home/satvir/Documents/dev/FastApi_Tutorial/.env/lib/python3.9/site-packages/starlette/routing.py", line 41, in app
    response = await func(request)
  File "/home/satvir/Documents/dev/FastApi_Tutorial/.env/lib/python3.9/site-packages/fastapi/routing.py", line 201, in app
    raw_response = await run_endpoint_function(
  File "/home/satvir/Documents/dev/FastApi_Tutorial/.env/lib/python3.9/site-packages/fastapi/routing.py", line 150, in run_endpoint_function
    return await run_in_threadpool(dependant.call, **values)
  File "/home/satvir/Documents/dev/FastApi_Tutorial/.env/lib/python3.9/site-packages/starlette/concurrency.py", line 34, in run_in_threadpool
    return await loop.run_in_executor(None, func, *args)
  File "/usr/lib/python3.9/concurrent/futures/thread.py", line 52, in run
    result = self.fn(*self.args, **self.kwargs)
  File "/home/satvir/Documents/dev/FastApi_Tutorial/./Blog/main.py", line 64, in update
    blog.update(request, synchronize_session=False)
  File "/home/satvir/Documents/dev/FastApi_Tutorial/.env/lib/python3.9/site-packages/sqlalchemy/orm/query.py", line 3204, in update
    upd = upd.values(values)
  File "<string>", line 2, in values
  File "/home/satvir/Documents/dev/FastApi_Tutorial/.env/lib/python3.9/site-packages/sqlalchemy/sql/base.py", line 106, in _generative
    x = fn(self, *args, **kw)
  File "<string>", line 2, in values
  File "/home/satvir/Documents/dev/FastApi_Tutorial/.env/lib/python3.9/site-packages/sqlalchemy/sql/base.py", line 135, in check
    return fn(self, *args, **kw)
  File "/home/satvir/Documents/dev/FastApi_Tutorial/.env/lib/python3.9/site-packages/sqlalchemy/sql/dml.py", line 701, in values
    for k, v in arg.items()
AttributeError: 'Blog' object has no attribute 'items'

schemas.Blog:

class Blog(BaseModel):
    title: str
    content: str

模型。博客:

class Blog(Base):
    __tablename__ = "blogs"

    id = Column(Integer, primary_key=True, index=True)
    title = Column(String)
    description = Column(String)

其他一切:创建、检索、删除方法都可以正常工作。 请帮我做什么


Tags: inpydevenvhomeliblinesite
1条回答
网友
1楼 · 发布于 2024-04-29 02:33:15

解决方案是将blog.update(request, synchronize_session=False)函数中的update更改为:

blog.update(request.__dict__, synchronize_session=False)

我会解释原因的

从提供的错误消息来看,sqlalchemy正在尝试在字典上循环,因此当它找不到dict类型时,会给出该错误消息

blog.update()方法中的request参数的类型为Class。要确认,请在if语句后添加这行代码:

print(type(request))

您应获得类似以下内容的输出:

<class 'blog.schemas.Blog'>

因此,出现了错误。现在这样做:print(type(request.__dict__))。您的输出应该与此类似:<class 'dict'>这解决了问题

相关问题 更多 >