Django控制台报API未找到错误,但浏览器可正常访问该API
问题
我搭建了一个Django后端,项目包含三个主要目录:base(存放模型的应用)、api(含views.py和urls.py的API应用)、backend(Django核心文件夹,含settings.py、wsgi.py等)。已有多个API正常运行,新增的/api/getmodel/API按相同步骤配置,但前端请求时Django控制台报错:
Not Found: /api/getmodel/ [25/Mar/2024 22:36:50] "GET /api/getmodel/ HTTP/1.1" 404 3116"
但在浏览器访问http://127.0.0.1:8000/api/getmodel/时,能看到Django REST Framework的默认视图,说明该API路径存在。
api目录下的urls.py配置:
from django.urls import path from . import views from rest_framework_simplejwt.views import ( TokenRefreshView, ) from .views import MyTokenObtainPairView urlpatterns = [ path('registeruser/', views.register_user), path('token/', MyTokenObtainPairView.as_view(), name='token_obtain_pair'), path('token/refresh/', TokenRefreshView.as_view(), name='token_refresh'), path('createmodel/', views.create_model), path('getmodel/', views.fetch_model), ]
views.py中对应API代码:
# 无法正常工作的API @api_view(['GET']) @permission_classes([IsAuthenticated]) def fetch_model(request): try: human_model = HumanModel.objects.get(user=request.user) if human_model.model_path: return Response({'model_path': human_model.model_path}) else: return Response({'message': 'No model path exists for the current user.'}) except HumanModel.DoesNotExist: return Response({'message': 'No model information found for the current user.'}, status=404)
backend核心目录下的urls.py已正确关联api路由,其他API均可正常使用。前端React项目已配置正确代理,其他API请求正常,前端Axios请求代码:
useEffect(() => { const fetchModelPath = async () => { if (!authTokens) return; try { const response = await axios.get('/api/getmodel/', { headers: { Authorization: `Bearer ${authTokens.access}`, }, }); if (response.data.model_path) { setModelPath(response.data.model_path); } else { setModelPath("create"); } } catch (error) { console.error("There was an error fetching the model path", error); setModelPath("create"); } }; fetchModelPath(); }, [authTokens]);
请问该API出现404错误的原因是什么?
分析与解决方案
从给出的信息来看,浏览器能直接访问但前端请求报404,大概率是请求路径差异或认证问题导致的路由匹配异常,具体排查方向如下:
- 检查前端实际请求路径:打开浏览器开发者工具的Network面板,查看前端发送的真实请求URL,确认是否和预期的
/api/getmodel/一致。重点排查代理配置是否给路径加了额外前缀,或者代码中路径拼写有误(比如多/少斜杠)。 - 排查认证导致的"伪404":该API加了
IsAuthenticated权限验证,若前端的authTokens.access无效、过期或格式错误(比如Bearer后缺少空格),Django可能返回401,但部分场景下会被处理为404。可以临时注释@permission_classes([IsAuthenticated]),再用前端请求测试:如果请求正常,就说明是token的问题;同时查看Network面板的响应状态码,确认真实状态是404还是401。 - 重启Django服务器:开发模式下修改路由后,可能存在缓存未更新的情况,重启服务器确保新路由生效,同时再次确认backend/urls.py中是否正确包含api路由(比如
path('api/', include('api.urls')))。 - 检查中间件顺序:确认Django的
settings.py中,django.contrib.auth.middleware.AuthenticationMiddleware存在且位置正确,认证相关中间件需要在路由匹配前执行,否则可能影响权限验证和路由匹配逻辑。
内容的提问来源于stack exchange,提问作者mayank
相关产品推荐
相关产品推荐

