You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 09:12:54