Django访问/hello出现404错误,请求排查问题原因
看起来你遇到的是典型的URL匹配问题,我们一步步来排查和解决:
核心问题分析
从你给出的错误信息来看,Django只尝试匹配了admin/这个路径,说明你的/hello请求没有匹配到项目urls.py里的任何规则。结合你描述的配置,最可能的问题出在URL路径的斜杠匹配或者项目urls.py的配置细节上。
具体排查步骤
1. 确认项目根urls.py的配置是否正确
首先检查lecture3/urls.py的代码,正确的写法应该是这样的:
from django.contrib import admin from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), # 重点:这里是'hello/',开头不要加斜杠,末尾保留斜杠 path('hello/', include('hello.urls')), ]
⚠️ 常见错误:如果这里写成了path('/hello/', include('hello.urls'))(开头多了斜杠),或者path('hello', include('hello.urls'))(末尾没加斜杠),都会导致匹配失败。
2. 检查hello应用的urls.py配置
你的hello应用urls.py应该是这样的(空路径对应index视图):
from django.urls import path from . import views urlpatterns = [ path('', views.index, name='index'), ]
这个配置是没问题的,它会匹配/hello/路径下的根请求。
3. 尝试正确的访问URL
你现在访问的是http://127.0.0.1:8000/hello,试试改成**http://127.0.0.1:8000/hello/(加上末尾的斜杠)**,如果能正常显示"Hello World!",那问题就找到了:
Django默认开启了APPEND_SLASH=True(在settings.py里),这个配置会自动将不带尾斜杠的请求重定向到带尾斜杠的版本,但如果你的项目中间件里缺少django.middleware.common.CommonMiddleware(负责处理这个重定向),就不会自动跳转。检查settings.py的MIDDLEWARE配置,确保包含这一行:
MIDDLEWARE = [ # ...其他中间件 'django.middleware.common.CommonMiddleware', # ...其他中间件 ]
4. 可选:支持不带斜杠的访问
如果你希望用户访问/hello也能正常打开页面,可以修改项目urls.py的路径,把hello/改成hello(去掉末尾斜杠):
path('hello', include('hello.urls')),
不过更推荐遵循Django的URL设计规范,保留尾斜杠,让框架自动处理重定向,这样更符合RESTful的URL设计习惯。
总结
最可能的原因是:
- 你访问的URL缺少末尾斜杠,且重定向机制未生效
- 项目urls.py的路径配置有误(开头多斜杠或末尾无斜杠)
按照上面的步骤排查,应该能快速解决问题。
内容的提问来源于stack exchange,提问作者ankit

