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
相关产品推荐
相关产品推荐

