
Django中URL未匹配到视图通常因路径定义缺少尾部斜杠导致,尤其在使用path()函数时需确保URL模式与请求路径严格一致,本文详解如何修正products/new/等路由404问题。
django中url未匹配到视图通常因路径定义缺少尾部斜杠导致,尤其在使用`path()`函数时需确保url模式与请求路径严格一致,本文详解如何修正`products/new/`等路由404问题。
在Django中,URL路由匹配是严格字符串匹配过程。从你提供的调试信息可以看出,Django尝试匹配的当前请求路径是 products/new/(注意末尾有斜杠),而你的 urlpatterns 中却只定义了 path('new', views.new) —— 这意味着它仅匹配 不带尾部斜杠 的 /products/new,而非 /products/new/。
Django默认启用 APPEND_SLASH=True(位于 settings.py),该设置会在请求路径不匹配且无尾斜杠时,自动重定向到加斜杠的版本(例如 /products/new → /products/new/)。但这一机制仅在URLconf中存在对应带斜杠的pattern时才生效。若你定义的是 path('new', ...),Django不会将其视为 /new/ 的候选,因此直接返回404。
✅ 正确做法:为所有 path() 模式显式添加尾部斜杠:
# products/urls.py
from django.urls import path
from . import views
urlpatterns = [
path('', views.index, name='products-index'),
path('salt/', views.trending, name='products-salt'), # ← 添加 '/'
path('new/', views.new, name='products-new'), # ← 添加 '/'
]
同时,请确认主路由(pyshop/urls.py)已正确包含该应用路由,并保留斜杠一致性:
# pyshop/urls.py
from django.contrib import admin
from django.urls import path, include
urlpatterns = [
path('admin/', admin.site.urls),
path('products/', include('products.urls')), # ← 注意这里也以 '/' 结尾
]
这样,完整匹配链即为:/products/ → 进入 products.urls
→ /new/ → 匹配 path('new/', views.new)
⚠️ 注意事项:
- 不要混用
path()和正则式re_path()的风格;path()是推荐的现代写法,但必须注重斜杠显式性; - 若你希望支持无斜杠访问(如
/products/new),可额外添加一条不带斜杠的规则,但强烈不建议——这会破坏RESTful约定,增加维护复杂度,且可能引发重定向循环; - Django 2.1 已于2020年结束官方支持,存在安全风险。请尽快升级至受支持的LTS版本(如Django 4.2+ 或 5.0+),以获得安全补丁、性能优化及更稳定的URL解析行为(例如对
strict_slashes的更好控制)。
? 小技巧:开发时可在浏览器地址栏手动测试 /products/new/ 和 /products/new,观察是否触发301重定向——若未重定向且报404,说明pattern确实缺失斜杠;启用Django调试面板(django-debug-toolbar)也能直观查看“尝试匹配的patterns”列表,辅助定位问题。
修正后重启开发服务器,http://127.0.0.1:8000/products/new/ 即可正常响应“New Products”。











