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
相关产品推荐
相关产品推荐

