Django使用router注册路由后访问对应地址返回404错误如何解决?
问题原因与解决方案
- 最核心的错误是你在
router.register的路径前缀末尾添加了$正则结束符。DRF的SimpleRouter/DefaultRouter注册路由时,会自动基于你传入的前缀拼接后续路由规则(比如视图集默认的list、detail路径后缀),手动添加$会直接截断路由匹配逻辑,导致生成的路由规则完全不符合预期,无法匹配你输入的请求地址。 - 其次如果你的视图集需要使用前缀中的
random_url参数,无需额外配置,默认就能从视图方法的self.kwargs中获取到该值。
修复方案
方案1:保留router注册逻辑
修改router注册代码,去掉末尾的$即可:
router.register(r"visual/(?P<random_url>[\w]+)", views.LinkTest, basename="test")
如果不需要DRF自动生成的多动作路由,也可以配置视图集的http_method_names限制允许的请求方法,避免生成多余路由。
方案2:直接配置URL(更适合单接口场景)
如果你的LinkTest视图集只需要对外暴露一个接口,可以不用router注册,直接在urlpatterns中添加正则路由即可,逻辑更直观:
from django.urls import re_path urlpatterns = [ # Admin path("admin/", admin.site.urls), # 直接配置自定义路由 re_path(r"rest/api/latest/visual/(?P<random_url>[\w]+)/$", views.LinkTest.as_view({'get':'list'}), name="test"), # 其他Model API Routes path("rest/api/latest/", include(router.urls)) ]
验证方式
修改后可以运行python manage.py show_urls(需安装django-extensions插件)查看实际生成的路由规则,确认和你预期的访问路径匹配即可。
内容的提问来源于stack exchange,提问作者nick
相关产品推荐
相关产品推荐

