Django ViewSet中食谱编辑路由404问题及重定向实现咨询
解决Recipe编辑页面404错误的方案
问题根源
从Nginx日志可以看出,请求GET /recipes/1/edit被Nginx当作静态文件请求处理,后端完全没收到请求。这是因为Django REST Framework的ModelViewSet默认不会生成/recipes/<pk>/edit这个路由,该路由未被后端接管,导致Nginx尝试在静态文件目录中查找对应路径,最终返回404。
DRF ModelViewSet默认生成的路由为:
/recipes/:GET(列表)、POST(创建)/recipes/<pk>/:GET(详情)、PUT(全量更新)、PATCH(部分更新)、DELETE(删除)
解决方案
方案1:修改前端按钮跳转地址(推荐)
直接将“update recipe”按钮的跳转目标从/recipes/<pk>/edit改为/recipes/<pk>/,或者调整为前端自身的编辑路由(比如前端单页应用的/recipes/edit/<pk>)。后端仅负责提供API接口,编辑页面的渲染由前端完成:
- 前端通过GET请求
/recipes/<pk>/获取食谱数据 - 编辑完成后通过PATCH请求
/recipes/<pk>/提交更新
方案2:后端添加重定向路由
如果无法修改前端代码,可在后端添加重定向逻辑,将/recipes/<pk>/edit的GET请求转发到正确的API地址。
方式A:在urls.py中直接添加重定向
在项目的主urls.py或recipes应用的urls.py中添加以下路由:
from django.shortcuts import redirect from django.urls import re_path urlpatterns = [ # 其他路由配置... re_path(r'^recipes/(?P<pk>\d+)/edit/$', lambda request, pk: redirect(f'/recipes/{pk}/'), name='recipe-edit-redirect'), ]
方式B:在RecipeViewSet中添加自定义Action
在RecipeViewSet中注册自定义action来处理/recipes/<pk>/edit的GET请求:
from django.shortcuts import redirect from rest_framework.decorators import action class RecipeViewSet(viewsets.ModelViewSet): # 原有代码... @action(detail=True, methods=['get'], url_path='edit') def edit_redirect(self, request, pk=None): # 重定向到食谱详情/更新API地址 return redirect(f'/recipes/{pk}/') # 也可以用reverse生成URL(需提前导入reverse) # from django.urls import reverse # return redirect(reverse('recipe-detail', kwargs={'pk': pk}))
添加后,DRF的路由注册器会自动生成/recipes/<pk>/edit的路由,将GET请求转发到该action,实现重定向。
为什么你之前的代码未生效
你之前编写的edit_redirect方法存在以下问题:
- 路由未注册:未通过
@action装饰器将方法注册为ViewSet的可用action,导致DRF未生成对应路由 - URL判断逻辑错误:
self.request.url是具体请求路径(如/recipes/1/edit),不会匹配'/<int:pk>/edit'这种路由模式 - 返回值错误:返回的是元组而非合法的
HttpResponseRedirect对象,无法被Django正确处理
内容的提问来源于stack exchange,提问作者user30835942
相关产品推荐
相关产品推荐

