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

