FastAPI:无法按预期处理错误

4
我正在学习FastAPI(并且非常喜欢它),所以很可能我做错了什么。但这是我的问题:
在下面的代码片段中,如果没有用户,我会创建一个新用户。
代码运行正常,但我遇到的问题是错误处理。错误被正确地推送到FastAPI的内部文档或像Postman这样的API客户端,但未返回给实际使用的客户端或命令行。
@app.post("/users/", response_model=schemas.User)
def create_user(user: schemas.UserCreate, db: Session = Depends(get_db)):
    db_user = crud.get_user_by_username(db, username=user.username)
    if db_user:
        raise HTTPException(
            status_code=400, detail=f"Username '{user.username}' already registered"
        )
    return crud.create_user(db=db, user=user)

如果我使用自动生成的FastAPI文档(或Postman)并通过该方式监控响应,我会得到我所期望的错误。

Proper error response in API docs

但是当我查看我在客户端端(Vue)接收到的内容或者uvicorn服务器记录的内容时,它并不包含那些信息:

Incorrect error response being logged

如您所见,它只是显示“Bad Request”,而不是响应JSON字典{"detail": "Username 'miketest' already registered"}
我做错了什么? 我该怎么做才能确保返回完整的HTTPException信息? 我很确定问题出在FastAPI端,因为客户端收到的正是服务器输出的内容。
2个回答

3

我找出了问题所在,它并不是FastAPI本身的问题,而是它向前端传递信息的方式。

我想把这个问题留下来,以防有人遇到同样的问题。


解决方案:

    try {
      await api().post('register',JSON.stringify(data);
    } catch (err) {
      error = err.response.data.detail;
    }

换句话说,FastAPI发送的错误是一个对象,其中包含一个response,它有一个data,而在data中还有一个detail

从Postman或类似工具返回的响应只给了一个带有detail的对象。我没有看到其中存在一个中间的data层,并且在Vue中无法完整地查看整个对象,因此遇到了问题。


2

这个截图 属于控制台日志,不包含API响应、JSON响应。

如果你使用一些客户端(如POSTMAN)发送请求到API,你就可以看到实际的响应结果。


是的,@Arakkal。我想我没有表达清楚我的观点:是的,无论我使用FastAPI文档还是Postman,API都会返回所需的信息。但是当我使用实际客户端或命令行时,如我在图像中所示,信息就会丢失。我更新了问题以澄清这一点。但是,我该如何正确地将响应传递给实际客户端(Vue)?你知道吗? - Mike Williamson
我不熟悉“vue.js”,但有趣的是,当您尝试使用命令行时,您说响应丢失了。您是如何尝试的?您能在OP中添加相同的内容吗? - JPG
抱歉,我所说的“命令行”是指从命令行启动服务器时获得的输出。 这就是我在上面提出问题的内容; 那就是具有蓝色背景的屏幕截图。 - Mike Williamson
您是否希望在这里获得JSON响应?(https://i.stack.imgur.com/zW4Ol.png) - JPG
是的。我想我现在不知道它是如何工作的。我以前使用过Flask(Python)和Express(JS)作为后端,但我承认我不是专家。我不明白为什么FastAPI可以向Postman和其内部API提供完整的输出,但不能将其返回到服务器日志或Vue。 - Mike Williamson
通常,框架都不会将日志输出到stdout。如果您的Vue没有收到任何JSON响应,但POSTMAN却有,那么问题很可能在您的Vue代码库中。 - JPG

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接