Django访问/category分类路径时出现404页面不存在错误
Django 分类路由404问题排查
两个访问场景的404是不同原因导致的,根urls.py中path('', include ('Blog.urls'))的配置没有路径前缀问题,不属于根路由挂载错误。
访问 /category/ 返回404的直接原因
当前Blog应用配置的分类路由为path("category/<str:cats>/", views.CategoryView, name="category"),该规则强制要求category/后必须携带cats路径参数,没有为不带参数的/category/路径配置匹配规则,自然会返回404。
访问 /category/Django 返回404的常见原因
你配置的分类路由结尾带斜杠,实际合法匹配路径是/category/Django/(末尾必须带斜杠),访问不带尾斜杠的路径返回404,通常是以下几个问题导致的:
- 路由配置存在重复导入冲突:Blog/urls.py中同时写了
from .views import CategoryView和from . import views,两套导入方式同时存在容易出现命名覆盖、循环导入问题,导致视图函数无法被正确路由找到 - 全局配置关闭了自动补斜杠:Django默认开启
APPEND_SLASH=True,会把不带尾斜杠的请求301跳转到带斜杠的对应路径,如果settings.py中手动把该配置改为False,或者MIDDLEWARE中移除了django.middleware.common.CommonMiddleware(自动补斜杠逻辑依赖这个中间件),就不会触发跳转,直接返回404 - 修改路由配置后没有重启Django开发服务,旧的路由缓存没有更新
注意:Post表中是否存在category为Django的文章不会触发路由层面的404,只会返回空的文章列表,不属于路由匹配问题
修复步骤
- 清理Blog/urls.py的重复导入,补充无参数的分类根路径路由,修改后代码如下:
from django.urls import path from .views import PostListViewHome, CategoryView urlpatterns = [ path("", PostListViewHome.as_view(), name="Blog-home"), path("category/", CategoryView, name="category-root", kwargs={'cats': None}), path("category/<str:cats>/", CategoryView, name="category"), ]
- 调整CategoryView逻辑,兼容无分类参数的访问场景:
from django.shortcuts import render from .models import Post def CategoryView(request, cats=None): if cats: category_posts = Post.objects.filter(category=cats) else: # 访问/category/时可自定义返回内容,比如返回全部分类文章、分类列表页 category_posts = Post.objects.all() return render(request, 'Blog/category.html', {'cats': cats, 'category_posts': category_posts})
- 检查settings.py配置:
- 确认
APPEND_SLASH未被手动设置为False(默认值为True,无特殊需求不用修改) - 确认MIDDLEWARE配置列表中保留了
django.middleware.common.CommonMiddleware
- 确认
- 重启Django开发服务,优先使用带尾斜杠的地址
/category/Django/测试路由匹配情况。
内容的提问来源于stack exchange,提问作者Zak Meshou
相关产品推荐
相关产品推荐

