Django REST Framework中已定义URL返回404错误问题排查
Django DRF ViewSet 无实现方法引发404错误的解决
问题现象
访问http://localhost:8000/users或http://localhost:8000/groups时返回404,但给ViewSet添加list方法后,URL可正常解析。
相关配置信息
INSTALLED_APPS
INSTALLED_APPS = [ "django.contrib.admin", "django.contrib.auth", "django.contrib.contenttypes", "django.contrib.sessions", "django.contrib.messages", "django.contrib.staticfiles", 'rest_framework', "abcd", ]
项目根urls.py
from django.contrib import admin from django.urls import path, include urlpatterns = [ path("admin/", admin.site.urls), path('', include('abcd.urls')) ]
abcd应用urls.py
from rest_framework import routers from abcd import views router = routers.DefaultRouter() router.register(r'users', views.UserViewSet, 'users') router.register(r'groups', views.GroupViewSet, 'groups') urlpatterns = router.urls
触发404的views.py
from rest_framework.viewsets import ViewSet class UserViewSet(ViewSet): pass class GroupViewSet(ViewSet): pass
可正常访问的views.py(添加list方法后)
class UserViewSet(ViewSet): def list(self, request): pass class GroupViewSet(ViewSet): def list(self, request): pass
问题原因
DRF的DefaultRouter会根据ViewSet中已实现的动作方法自动生成对应URL路由。ViewSet是一个基础框架类,本身没有默认实现任何HTTP动作方法(如list、retrieve、create等),因此当ViewSet为空实现时,路由器不会生成有效的URL规则,访问自然返回404。只有当你实现了对应的动作方法(比如list),路由器才会识别并生成匹配的URL条目。
解决方案
方案1:手动实现所需动作方法
根据业务需求,在ViewSet中实现对应的HTTP动作方法,比如列表、详情、创建等:
from rest_framework.viewsets import ViewSet from rest_framework.response import Response class UserViewSet(ViewSet): def list(self, request): # 列表逻辑 return Response({"message": "用户列表"}) def retrieve(self, request, pk=None): # 详情逻辑 return Response({"message": f"用户{pk}详情"})
方案2:使用预实现的ViewSet类
如果需要快速搭建具备完整CRUD功能的接口,直接继承DRF提供的ModelViewSet(需配合模型和序列化器),它默认实现了所有标准动作方法:
from rest_framework.viewsets import ModelViewSet from .models import User, Group from .serializers import UserSerializer, GroupSerializer class UserViewSet(ModelViewSet): queryset = User.objects.all() serializer_class = UserSerializer class GroupViewSet(ModelViewSet): queryset = Group.objects.all() serializer_class = GroupSerializer
内容的提问来源于stack exchange,提问作者nlblack323
相关产品推荐
相关产品推荐

