Django访问api/v1/latest-products返回404错误排查求助
问题根因
你遇到的404错误完全由路由配置不匹配导致,核心问题如下:
- 你当前把
latest-products/路由直接写在了根urls.py的顶层,没有嵌套api/v1/前缀,所以该路由的实际可访问路径是/latest-products/,和你请求的/api/v1/latest-products路径不匹配 - Django路由匹配严格遵循顺序规则,你当前根路由的配置下,
api/v1/前缀下的子路由没有包含latest-products的规则,自然匹配失败
修复方案
推荐选择第二种更符合Django应用拆分规范的方案:
方案1:直接修改根路由前缀
把根urls.py里的路由规则修改为带api/v1/前缀即可:
# 根urls.py urlpatterns = [ # 把原来的latest-products路由替换成下面这行 path('api/v1/latest-products/', views.LatestProductsList.as_view()), path('api/v1/', include('djoser.urls')), path('api/v1/', include('djoser.urls.authtoken')), path('api/v1/', include('product.urls')), ] + static(settings.MEDIA_URL, document_root=settings.MEDIA_ROOT)
方案2:路由归到product应用下(推荐)
- 先删掉根urls.py里顶层的
path('latest-products/', views.LatestProductsList.as_view()),这行代码 - 在product应用目录下新建
urls.py文件,写入以下内容:
# product/urls.py from django.urls import path from . import views urlpatterns = [ path('latest-products/', views.LatestProductsList.as_view()), ]
因为你已经在根urls.py中配置了path('api/v1/', include('product.urls')),会自动给product应用下的所有路由拼接/api/v1/前缀,最终可访问路径就是你需要的/api/v1/latest-products/
额外注意项
- Django默认开启
APPEND_SLASH配置,请求路径不带尾部斜杠时会自动301重定向到带斜杠的路径,如果你手动关闭了该配置,需要确保请求路径和路由规则的斜杠完全一致 - 检查
views.py中get方法下的代码缩进,你贴出的代码中products = Product.objects.all()[0:4]这行缩进和def get同级,属于语法错误,缩进调整为比def get多4个空格即可 - 路由配置修改后需要重启Django开发服务才会生效
内容的提问来源于stack exchange,提问作者Francisco Azocar
相关产品推荐
相关产品推荐

