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

FastAPI删除接口未触发HTTPException:返回204而非404

问题原因及修复方案

核心问题分析

你的代码存在两个关键问题,导致删除不存在的ID时未触发404异常:

1. 异常抛出位置错误

raise HTTPException被放在了for循环内部(与if分支同级),这会导致两种错误情况:

  • 当EVENTS列表为空时,for循环完全不会执行,异常不会被触发,函数直接返回None,接口默认的status_code=204会被返回。
  • 当EVENTS列表有多个事件时,只要第一个事件的ID不匹配,就会立刻抛出异常,后续事件不会被检查,逻辑完全错误。

2. 事件删除逻辑依赖索引,存在潜在风险

你用del EVENTS[event_id-1]删除事件,是假设事件的id和列表索引+1严格对应,但如果有事件被删除过(比如删除id=1的事件后再添加id=3的事件),索引和ID会脱节,导致删错元素。

修复后的代码

@events_router.delete("/events/{event_id}", status_code=204)
def delete_event(*, event_id: int) -> None:
    target_index = None
    # 遍历列表找到目标事件的索引
    for index, event in enumerate(EVENTS):
        if event['id'] == event_id:
            target_index = index
            break
    
    # 未找到事件则抛出404
    if target_index is None:
        raise HTTPException(
            status_code=404,
            detail=f"Event with ID {event_id} not found"
        )
    
    # 通过真实索引删除事件
    del EVENTS[target_index]
    print(f"event id = {event_id} deleted!")

修复说明

  • 先通过enumerate遍历列表,记录匹配事件的真实索引,遍历完成后统一判断是否找到目标事件,确保空列表、不匹配ID等所有场景都能触发404异常。
  • 用找到的真实索引删除事件,避免ID与索引脱节导致的删除错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 18:17:27