Django添加chat/路由后URL配置报错,空路径可正常运行如何解决?
问题原因
- 根URL配置顺序错误:Django的路由匹配遵循从上到下的优先级规则,所有路径都能匹配空字符串
'',你将path('', include('blog.urls'))放在path('chat/', include('chat.urls'))之前,请求/chat/前缀的路径时会先进入blog应用的路由匹配,若blog没有对应路由才会向后匹配chat应用的配置,大概率会被blog的路由拦截或返回404错误。 - 模板表单路径写死:你在index.html的表单中直接用了相对路径
action="checkview",当chat应用挂载在/chat/路径下时,相对路径会根据当前页面的地址解析,若访问路径没有带尾斜杠、或者从其他页面跳转进入chat页面,就会解析到根路径下的/checkview,无法匹配chat应用的路由。
解决方案
- 调整根URL配置顺序,把前缀更精准的路由放在前面,避免被空路径的路由提前拦截,修改后根urls.py的
urlpatterns如下:
from django.contrib import admin from django.contrib.auth import views as auth_views from django.urls import path, include from django.conf import settings from django.conf.urls.static import static urlpatterns = [ path('admin/', admin.site.urls), # 把chat路由移到空路径路由前面 path('chat/', include('chat.urls')), path('', include('blog.urls')), ]
- 替换模板中的硬编码相对路径,使用Django内置的
url模板标签自动生成正确的路由地址,修改index.html中的form标签:
原代码:
<form id="post-form" method="POST" action="checkview">
修改后:
<form id="post-form" method="POST" action="{% url 'checkview' %}">
- 额外检查:如果chat应用的视图中存在硬编码的跳转路径,也要替换为
reverse函数动态生成路由,比如把redirect(f'/chat/{room_name}/')改为redirect(reverse('room', args=[room_name])),避免路径绑定失效。
内容的提问来源于stack exchange,提问作者Goodworks
相关产品推荐
相关产品推荐

