解决Django Rest Framework缺失key引发的报错问题
解决Django REST Framework删除端点的KeyError问题
当前代码直接通过request.data["delete"]访问键,当键不存在时会抛出KeyError导致程序崩溃,无法进入错误分支。可以通过以下方式修复:
核心修复点
- 用字典的
get()方法安全获取键值,避免KeyError - 同时检查
email参数的存在性,防止后续操作报错 - 调整错误状态码为更合适的
400 Bad Request(原401适用于权限验证失败,此处属于请求参数错误)
修改后的代码
class Leads(APIView): @staticmethod def delete(request): # 安全获取delete参数,键不存在时返回默认值False delete_flag = request.data.get('delete', False) # 获取email参数,键不存在时返回None email = request.data.get('email') if delete_flag is True and email: # 执行数据库删除,返回删除记录数 deleted_count = Lead.objects.filter(email=email).delete()[0] # 执行ActiveCampaign删除操作 lead = LeadHelper(email=email) lead.delete_from_activecampaign() return Response({ "message": f"成功删除 {deleted_count} 条记录", "deleted_email": email }, status=status.HTTP_200_OK) else: # 构造明确的错误提示 error_msg = [] if not delete_flag: error_msg.append("需要传入 'delete': true 才能执行删除操作") if not email: error_msg.append("缺失必填参数 'email'") payload = { "message": "; ".join(error_msg) } return Response(payload, status=status.HTTP_400_BAD_REQUEST)
代码说明
- 安全参数获取:
request.data.get()方法在目标键不存在时不会抛出异常,而是返回指定默认值(或None),避免程序崩溃。 - 双重条件校验:只有同时满足
delete为True且email存在时,才执行删除逻辑,避免无效或危险操作。 - 响应信息优化:删除成功后返回具体删除数量和目标邮箱,错误时明确指出缺失的参数,方便调用方调试。
- 状态码修正:使用
400 BAD REQUEST更贴合请求参数错误的场景,原401 UNAUTHORIZED语义用于身份验证失败,不符合当前需求。
内容的提问来源于stack exchange,提问作者Matheus Tenório
相关产品推荐
相关产品推荐

