Django与DRF路由共存问题:新增常规应用URL无法访问
嘿,咱们一步步来排查你的webapp URL无法访问的问题,大概率是路由配置的优先级或者包含方式出了问题~
1. 先确认主urls.py是否正确包含webapp的路由
你的主urls.py已经导入了include,但得确保你添加了webapp的路由条目,还要注意路由顺序和前缀——DRF的路由很容易覆盖其他路由。比如正确的主urls.py配置应该是这样:
from django.conf.urls import url, include from django.contrib import admin from rest_framework import routers from rest_framework.authtoken import views # 你的DRF router配置 router = routers.DefaultRouter() router.register(r'your-model', YourModelViewSet) urlpatterns = [ url(r'^admin/', admin.site.urls), # 给DRF API加明确的前缀(比如/api/),避免覆盖其他路由 url(r'^api/', include(router.urls)), url(r'^api-token-auth/', views.obtain_auth_token), # 关键:添加webapp的路由,放在DRF路由之后也不会被覆盖了 url(r'^webapp/', include('webapp.urls')), ]
如果之前你把DRF的路由写成url(r'^', include(router.urls))(没有前缀),它会匹配所有未被前面路由拦截的路径,直接把webapp的路由给覆盖了,这是最常见的坑!
2. 检查webapp自身的urls.py是否配置正确
确保webapp目录下有urls.py,并且里面的路由规则是有效的,比如:
# webapp/urls.py from django.conf.urls import url from . import views urlpatterns = [ # 匹配/webapp/路径 url(r'^$', views.home, name='webapp-home'), # 匹配/webapp/about/路径 url(r'^about/$', views.about, name='webapp-about'), ]
这里要注意正则表达式的写法,^$代表空路径(对应webapp的根路径),不要漏掉开头和结尾的锚点符号。
3. 验证webapp的视图是否正常工作
有时候URL能匹配,但视图本身有问题(比如模板不存在、语法错误)也会导致无法访问。可以先写个最简单的视图测试:
# webapp/views.py from django.http import HttpResponse def home(request): return HttpResponse("Webapp Home Page!") # 先返回纯文本测试
如果访问/webapp/能看到这段文本,说明路由没问题,问题出在后续的视图逻辑或模板上。
4. 用Django的resolve工具排查路由匹配
如果还是不确定,可以用Django自带的resolve命令验证URL是否能正确匹配到视图:
在终端运行:
python manage.py shell
然后输入:
from django.urls import resolve resolve('/webapp/') # 替换成你要测试的URL
如果返回结果里包含webapp的视图,说明路由配置正确;如果抛出Resolver404错误,那肯定是路由规则没写对,得回头调整正则表达式或者路由顺序。
5. 检查APPEND_SLASH设置
Django默认APPEND_SLASH = True,如果你访问的是/webapp(不带斜杠),它会尝试重定向到/webapp/,但如果服务器配置或者中间件有问题,可能导致重定向失败。可以直接访问带斜杠的路径测试,或者在settings.py里确认这个配置是否开启。
内容的提问来源于stack exchange,提问作者floflo29

