Django额外动作详情视图带参数:无末尾斜杠访问404问题排查
问题排查与解决方案
1. 检查APPEND_SLASH配置
打开项目settings.py,确认APPEND_SLASH值为True(Django默认配置)。若该值被设为False,Django不会自动将不带末尾斜杠的请求重定向到带斜杠版本,直接返回404。
若被修改过,恢复为:
APPEND_SLASH = True
2. 调整Action的URL正则匹配
你的abc_detail action的url_path正则未兼容不带末尾斜杠的请求,导致仅带斜杠的请求能匹配。修改正则表达式,允许末尾斜杠可选:
@action(detail=True, method=["get"], url_path=r"abc/(?P<name>[A-Za-z\.]+)/?") def abc_detail(self, request, pk, name): # 你的业务逻辑代码 ....
其中/?表示末尾斜杠为可选,同时匹配abc/xy.z和abc/xy.z/两种格式。
3. 修正冗余Action的路由问题
你定义的第一个abc action存在路由冲突风险:它标记了detail=True,但参数包含name却未在url_path中定义对应的捕获组,会导致该Action的URL无法正确生成,干扰正常路由匹配。建议要么补充该Action的url_path捕获组,要么直接删除冗余的abc Action。
4. 确认路由配置正确性
确保项目根URLconf中,ViewSet的路由配置使用DefaultRouter或SimpleRouter(二者默认处理末尾斜杠逻辑),示例配置如下:
from rest_framework.routers import DefaultRouter from .views import MyViewSet router = DefaultRouter() router.register(r'employee', MyViewSet) urlpatterns = [ path('', include(router.urls)), ]
内容的提问来源于stack exchange,提问作者TechSavy
相关产品推荐
相关产品推荐

