使用Django REST Framework开发API时DELETE请求出现404及JSON解析错误
Django-REST-Framework DELETE请求404问题排查与解决
问题现象
发送DELETE请求删除对象时返回404 (Not Found),同时控制台报错:Uncaught (in promise) SyntaxError: Unexpected token '<', "<!DOCTYPE "... is not valid JSON,POST/GET请求可正常执行。
核心原因
后端路由配置与前端请求的URL不匹配:
- 后端
urls.py中deleteFavourite路径无末尾斜杠:path('deleteFavourite', views.deleteFavourites), - 前端请求的URL带末尾斜杠:
fetch("http://127.0.0.1:8000/deleteFavourite/" , {...})
Django路由匹配规则严格,两个URL会被判定为不同路径,导致请求找不到对应视图,返回404的HTML页面,前端解析JSON时自然报错。
解决方案
1. 统一URL路径的斜杠(优先方案)
修改后端urls.py,给deleteFavourite路径添加末尾斜杠,与其他路由保持一致:
urlpatterns = [ path('getFavourite/', views.getFavourites), path('addFavourite/', views.addFavourites), path('deleteFavourite/', views.deleteFavourites), # 补充末尾斜杠 ]
2. 增强视图健壮性(可选但推荐)
当前deleteFavourites视图未做异常处理,若请求无name参数或对应对象不存在,会直接抛出500错误。建议添加异常捕获:
from rest_framework import status # 导入状态码模块 @api_view(['DELETE']) def deleteFavourites(request): try: name = request.data.get('name') # 校验name参数是否存在 if not name: return Response({"error": "必须提供name参数"}, status=status.HTTP_400_BAD_REQUEST) # 查找并删除目标对象 favorite = Favorite.objects.get(name=name) favorite.delete() return Response({"result": "收藏已删除"}) except Favorite.DoesNotExist: return Response({"error": "该收藏不存在"}, status=status.HTTP_404_NOT_FOUND)
3. 前端请求容错处理(可选)
在前端添加响应状态码检查,避免非JSON响应导致的解析错误:
function favDelete(name){ console.log(name) fetch("http://127.0.0.1:8000/deleteFavourite/" , { method:"DELETE", headers: { 'Content-Type' : 'application/json' }, body:JSON.stringify({"name":name}) }) .then(response => { if (!response.ok) { throw new Error(`请求失败:${response.status}`); } return response.json(); }) .then(data => console.log(data.result)) .catch(error => console.error(error)) }
内容的提问来源于stack exchange,提问作者Ramin
相关产品推荐
相关产品推荐

