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

Django REST Framework无法显示可浏览API界面问题求助

问题描述

我使用Django REST Framework开发认证API,后续计划用React调用该API,但访问http://127.0.0.1:8000/api时无法显示DRF的可浏览API界面。以下是项目相关代码,请求排查解决:

auth_app/models.py

from django.db import models
from django.contrib.auth.models import AbstractBaseUser,BaseUserManager,PermissionsMixin

class CustomUserManager(BaseUserManager):
    def create_user(self,email,password=None,**extra_fields):
        if not email:
            raise ValueError('The Email Field must be set')
        email = self.normalize_email(email)
        user = self.model(email=email,**extra_fields)
        user.set_password(password)
        user.save(using=self._db)
        return user
    def create_superuser(self,email,password=None,**extra_fields):
        extra_fields.setdefault('is_staff',True)
        extra_fields.setdefault('is_superuser',True)
        return self.create_user(email,password,**extra_fields)
class CustomUser(AbstractBaseUser,PermissionsMixin):
    email = models.EmailField(unique=True)
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)
    is_active = models.BooleanField(default=True)
    is_staff = models.BooleanField(default=False)
    objects = CustomUserManager()

    USERNAME_FIELD = 'email'
    REQUIRED_FIELDS = ['first_name','last_name']

    def __str__(self):
        return self.email

auth_app/serializers.py

from rest_framework import serializers
from .models import CustomUser

class CustomUserSerializer(serializers.ModelSerializer):
    class Meta:
        model = CustomUser
        fields = ('id','email','first_name','last_name','is_active','is_staff')

auth_app/views.py

from rest_framework import generics,permissions,status
from rest_framework.response import Response
from rest_framework.views import APIView
from rest_framework_simplejwt.tokens import RefreshToken
from django.contrib.auth import login,logout,authenticate
from django.contrib.auth.decorators import login_required
from django.utils.decorators import method_decorator
from .serializers import CustomUserSerializer

class RegistrationAPIView(APIView):
    def post(self,request):
        serializer = CustomUserSerializer(data=request.data)
        if serializer.is_valid():
            user = serializer.save()
            refresh = RefreshToken.for_user(user)
            return Response(
                {
                    "refresh": str(refresh),
                    "access": str(refresh.access_token),
                },
                status=status.HTTP_201_CREATED,
            )
        return Response(serializer.errors,status=status.HTTP_400_BAD_REQUEST)
 
   
class LoginAPIView(APIView):
    def post(self,request):
        email = request.data.get("email")
        password = request.data.get("password")
        user = authenticate(request, email=email,password=password)
        if user:
            login(request,user)
            refresh = RefreshToken.for_user(user)
            return Response(
                {
                    "refresh":str(refresh),
                    "access": str(refresh.access_token),
                },
                status=status.HTTP_200_OK
            )
        return Response({"error":"Invalid Credentials"},status=status.HTTP_401_UNAUTHORIZED)
@method_decorator(login_required,name="dispatch")      
class LogoutAPIView(APIView):
    def post(self,request):
        logout(request)
        return Response({"message":"Logged out Successfully"}, status=status.HTTP_200_OK)

auth_app/urls.py

from django.urls import path
from .views import RegistrationAPIView,LoginAPIView,LogoutAPIView

urlpatterns=[
    path('register/',RegistrationAPIView.as_view,name="register"),
    path('login/',LoginAPIView.as_view,name='login'),
    path('logout/',LogoutAPIView.as_view,name='logout'),
]

auth_project/urls.py

from django.contrib import admin
from django.urls import path,include

urlpatterns = [
    path('admin/', admin.site.urls),
    path('api/',include('auth_app.urls')),
    ]
排查与解决方法

1. 根路由/api/无对应视图处理

当前访问/api/时,没有任何视图响应这个路径——auth_app.urls里只定义了register/、login/、logout/三个子路由,DRF的可浏览API需要有明确的视图来渲染根界面。

解决方法:添加API根视图

在auth_app/views.py中添加根视图函数:

from rest_framework.decorators import api_view
from rest_framework.response import Response
from django.urls import reverse

@api_view(['GET'])
def api_root(request, format=None):
    return Response({
        'register': reverse('register', request=request, format=format),
        'login': reverse('login', request=request, format=format),
        'logout': reverse('logout', request=request, format=format)
    })

然后修改auth_app/urls.py,添加根路径的路由:

from django.urls import path
from .views import RegistrationAPIView, LoginAPIView, LogoutAPIView, api_root

urlpatterns=[
    path('', api_root, name='api-root'),  # 新增根路由
    path('register/', RegistrationAPIView.as_view(), name="register"),
    path('login/', LoginAPIView.as_view(), name='login'),
    path('logout/', LogoutAPIView.as_view(), name='logout'),
]

2. 确认DRF可浏览界面配置正常

检查项目settings.py,确保以下配置正确:

  • INSTALLED_APPS包含rest_framework:
INSTALLED_APPS = [
    # 其他内置应用
    'rest_framework',
    'rest_framework_simplejwt',
    'auth_app',
]
  • REST_FRAMEWORK配置中启用了BrowsableAPIRenderer:
REST_FRAMEWORK = {
    'DEFAULT_RENDERER_CLASSES': [
        'rest_framework.renderers.JSONRenderer',
        'rest_framework.renderers.BrowsableAPIRenderer',  # 必须保留这一行
    ],
    # 其他DRF配置(比如认证类)
}

3. 确保根视图允许匿名访问

新增的api_root视图没有添加权限验证装饰器,默认允许匿名用户访问,这样未登录的用户也能看到可浏览API界面。

完成以上修改后,重启Django服务,访问http://127.0.0.1:8000/api就能看到DRF的可浏览API界面了。

内容的提问来源于stack exchange,提问作者M Junaid

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 14:45:14