Django服务器莫名返回404错误求助
问题现象
运行python manage.py runserver启动服务器后,访问http://127.0.0.1:8000/返回404错误。仅编辑过contato.html添加Instagram跳转锚点,未修改过urls.py文件。
错误日志
System check identified no issues (0 silenced). July 27, 2022 - 17:30:51 Django version 4.0.6, using settings 'sitewilza.settings' Starting development server at http://127.0.0.1:8000/ Quit the server with CTRL-BREAK. Not Found: / [27/Jul/2022 17:30:53] "GET / HTTP/1.1" 404 2573 Not Found: / [27/Jul/2022 17:30:57] "GET / HTTP/1.1" 404 2573
服务器返回的404提示
Page not found (404)
Request Method: GET
Request URL: http://127.0.0.1:8000/
Using the URLconf defined in sitewilza.urls, Django tried these URL patterns, in this order:admin/
sobremim [name='sobre']
formacao [name='formacao']
contato [name='contato']
The empty path didn’t match any of these.You’re seeing this error because you have DEBUG = True in your Django settings file. Change that to False, and Django will display a standard 404 page.
当前URL配置
主项目sitewilza/urls.py
from django.urls import path, include urlpatterns = [ path('admin/', admin.site.urls), path('', include('website.urls')), ]
应用website/urls.py
from django.urls import path from . import views urlpatterns = [ path('sobremim', views.sobremim, name='sobre'), path('formacao', views.formacao, name='formacao'), path('contato', views.contato, name='contato'), ]
问题原因与解决方案
问题核心:URL配置中未为根路径/定义对应的视图规则,Django找不到匹配空路径的路由,因此返回404。
提供两种解决方式,任选其一即可:
方案一:直接为根路径绑定视图
在website/urls.py中添加根路径路由,指向你想作为首页的视图(比如把sobremim设为首页):urlpatterns = [ path('', views.sobremim, name='home'), # 新增根路径路由 path('sobremim', views.sobremim, name='sobre'), path('formacao', views.formacao, name='formacao'), path('contato', views.contato, name='contato'), ]也可以专门编写一个首页视图函数
views.home,再绑定到根路径。方案二:将根路径重定向到现有页面
先在website/urls.py导入RedirectView,再添加重定向路由:from django.urls import path from django.views.generic.base import RedirectView from . import views urlpatterns = [ path('', RedirectView.as_view(url='sobremim/', permanent=True)), # 重定向到sobremim页面 path('sobremim', views.sobremim, name='sobre'), path('formacao', views.formacao, name='formacao'), path('contato', views.contato, name='contato'), ]
额外建议:现有路由末尾未加/,按照Django默认配置(APPEND_SLASH = True),访问时会自动重定向到带/的路径,建议统一为路由添加末尾的/,保持规范:
path('sobremim/', views.sobremim, name='sobre'), path('formacao/', views.formacao, name='formacao'), path('contato/', views.contato, name='contato'),
内容的提问来源于stack exchange,提问作者Rafael Galvao

