You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

FastAPI删除接口未抛出异常问题求助

问题原因与解决方案

核心问题

你的代码中没有正确抛出HTTP异常,而是用return返回了HTTPException对象。FastAPI只有在raise异常时才会触发异常处理逻辑,返回对应的错误状态码;用return的话,这个异常对象会被当作普通响应内容,但因为你在接口装饰器里指定了status_code=status.HTTP_204_NO_CONTENT,FastAPI会强制返回204状态码(204不允许有响应体,异常信息也会被丢弃),这就是为什么不管参数是否正确都返回204的原因。

修复步骤

把所有return HTTPException(...)替换成raise HTTPException(...):

修改后的代码:

from fastapi import FastAPI, HTTPException, Depends, status
from sqlalchemy.orm import Session
import models

app = FastAPI()

def get_db():
    # 此处替换为你的数据库会话获取逻辑
    db = ...
    try:
        yield db
    finally:
        db.close()

@app.delete('/', status_code=status.HTTP_204_NO_CONTENT)
async def delete_config(service: str, version: str, db: Session = Depends(get_db)):
    service_instance = db.query(models.Service).filter(
        models.Service.name == service
    ).first()
    if service_instance is None:
        raise HTTPException(status_code=status.HTTP_404_NOT_FOUND, detail='Service not found')
    version_instance = db.query(models.ServiceVersion).filter(
        models.ServiceVersion.service_id == service_instance.id
    ).filter(models.ServiceVersion.version == version).first()
    print(version_instance)
    if version_instance is None:
        raise HTTPException(
            status_code=status.HTTP_404_NOT_FOUND, detail='Version of service not found'
        )
    if version_instance.is_used:
        raise HTTPException(status_code=status.HTTP_400_BAD_REQUEST, detail='Config is in use')
    # 删除关联的ServiceKey记录
    db.query(models.ServiceKey).filter(
        models.ServiceKey.service_id == service_instance.id,
        models.ServiceKey.version_id == version_instance.id
    ).delete()
    # 删除ServiceVersion记录
    db.query(models.ServiceVersion).filter(
        models.ServiceVersion.service_id == service_instance.id,
        models.ServiceVersion.version == version
    ).delete()
    db.commit()

额外优化建议

  • 资源不存在(服务或版本找不到)更符合REST规范的状态码是404 NOT FOUND,而非400 BAD REQUEST,上述代码已做对应调整
  • 条件判断version_instance.is_used == True可简化为version_instance.is_used,代码更简洁
  • 删除操作的过滤条件可合并为一个filter,提升代码紧凑性

内容的提问来源于stack exchange,提问作者Konstantinos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 06:55:47