Django 2.0.4中path路由无法工作,路由匹配失败如何解决?
解决Django 2.x空路径路由匹配失败的问题
嘿,我来帮你搞定这个头疼的路由问题!首先咱们先拆解下报错信息:系统说只尝试了admin/和^media/(?P<path>.*)$这两个模式,空路径没匹配到,这说明你的根URL配置(src/urls.py)里压根没给空路径(也就是网站首页)设置对应的路由规则。
Django 2.x确实移除了旧的url()方法(不过re_path()是它的别名,功能完全一致),但官方主推的path()其实更简洁,完全能满足大部分常规路由需求,不用非得退回去用正则。下面给你两种常见的解决方案,你根据自己的需求选:
方案1:直接给空路径绑定视图函数
如果你的首页逻辑很简单,直接在根urls.py里绑定对应的视图就行:
from django.contrib import admin from django.urls import path from django.conf.urls.static import serve from django.conf import settings # 导入你的首页视图,比如从home应用导入home_view from home.views import home_view urlpatterns = [ path('admin/', admin.site.urls), # 关键就是这一行:空字符串对应根路径,绑定你的首页视图 path('', home_view, name='home'), path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT}), ]
方案2:将空路径转发给子应用的URL配置
如果你的首页逻辑属于某个子应用(比如blog),那就用include()把根路径的请求转发给子应用的urls.py处理:
首先修改根src/urls.py:
from django.contrib import admin from django.urls import path, include from django.conf.urls.static import serve from django.conf import settings urlpatterns = [ path('admin/', admin.site.urls), # 把空路径的请求交给blog应用的urls处理 path('', include('blog.urls')), path('media/<path:path>', serve, {'document_root': settings.MEDIA_ROOT}), ]
然后在blog/urls.py里添加根路径的匹配规则:
from django.urls import path from . import views urlpatterns = [ # 这里的空字符串就对应网站的根路径了 path('', views.blog_index, name='blog_index'), ]
几个要注意的小细节
- 路由匹配是按顺序执行的,所以空路径的规则别被其他更具体的规则挡住(不过空路径是最宽泛的,一般放在前后都没问题)
- 确保你导入的视图函数没有语法错误,不然即使路由配对了也会报错
- 如果需要复杂的正则匹配再用
re_path(),常规场景下path()的路径转换器(比如<str:name>、<int:pk>)完全够用,比正则好写多了
内容的提问来源于stack exchange,提问作者DjangoMan
相关产品推荐
相关产品推荐

