Django配置带slug的update-recipe路由返回404是遗漏了什么配置吗?
Django路由404问题排查方案
- 优先检查路由匹配顺序
Django的路由规则是从上到下依次匹配,匹配到第一个符合规则的路径就会终止匹配。如果你的path('<slug:recipe_slug>/', xxx)这类宽泛路由定义在update-recipe/<slug:recipe_slug>/的上方,那么访问update-recipe/xxx/时,update-recipe会被识别为slug参数的值,被前面的短路径路由优先拦截,最终触发404。
正确的路由配置顺序示例:urlpatterns = [ # 具体路由放在最前 path('update-recipe/<slug:recipe_slug>/', views.update_recipe, name='update_recipe'), # 宽泛的slug路由放在后方 path('<slug:recipe_slug>/', views.recipe_detail, name='recipe_detail'), ] - 检查根路由的前缀配置
如果你是在应用(app)的urls.py中配置的路由,需要确认项目根目录下的urls.py中include该应用路由时是否添加了额外前缀,比如根路由配置为path('recipes/', include('recipes.urls')),那么你的目标访问路径应该是/recipes/update-recipe/xxx/,直接访问/update-recipe/xxx/就会返回404。而你修改为短路径后访问/recipes/xxx/符合路由规则,所以能正常运行。 - 检查访问路径的末尾斜杠
Django默认开启APPEND_SLASH配置,如果你访问时没有加末尾的斜杠(比如访问/update-recipe/xxx而非/update-recipe/xxx/),会自动重定向到带斜杠的路径。如果你手动关闭了该配置,不加斜杠就会直接返回404。 - 验证slug参数的合法性
Django的slug类型转换器默认只匹配ASCII字母、数字、连字符-和下划线_,如果你传入的参数包含中文、特殊符号等不符合规则的内容,会匹配失败返回404。
内容的提问来源于stack exchange,提问作者mohammed shajahan
相关产品推荐
相关产品推荐

