DRF集成simplejwt与drf_yasg时出现coreapi.Field属性错误
问题解决:导入ObtainAuthToken时触发AttributeError: 'NoneType' object has no attribute 'Field'
问题分析
你的DRF项目中,rest_framework.authtoken.views.ObtainAuthToken视图依赖coreapi库生成接口文档字段,但当前环境要么未安装coreapi,要么drf_yasg与coreapi的文档生成逻辑冲突,导致coreapi模块无法正常导入,最终触发该错误。
解决方案
方案1:安装coreapi依赖
在requirements.txt中添加coreapi,执行安装命令:
pip install coreapi
安装完成后重新导入即可解决问题,因为DRF的ObtainAuthToken视图需要coreapi定义文档字段。
方案2:自定义视图脱离ObtainAuthToken依赖
既然已经使用simplejwt做身份验证,且核心逻辑已实现,可直接继承APIView而非ObtainAuthToken,彻底规避coreapi依赖:
from rest_framework.views import APIView from rest_framework.response import Response from rest_framework import status from .serializers import CustomAuthTokenSerializer from rest_framework.authtoken.models import Token class CustomObtainAuthToken(APIView): serializer_class = CustomAuthTokenSerializer def post(self, request, *args, **kwargs): serializer = self.serializer_class( data=request.data, context={"request": request} ) serializer.is_valid(raise_exception=True) user = serializer.validated_data["user"] token, created = Token.objects.get_or_create(user=user) return Response( { "user_id": user.pk, "email": user.email, "token": token.key, }, status=status.HTTP_200_OK )
方案3:替换DRF默认文档生成类
因使用drf_yasg生成接口文档,无需DRF自带的coreapi文档系统,在settings.py中修改配置:
REST_FRAMEWORK = { # 保留其他原有配置 'DEFAULT_SCHEMA_CLASS': 'rest_framework.schemas.openapi.AutoSchema', }
该配置将DRF默认的coreapi schema替换为openapi标准,与drf_yasg兼容的同时避免coreapi依赖问题。
用户提供的相关信息
错误堆栈
File "C:\Users\ASUS\OneDrive\Desktop\django\Django-Advance\core\accounts\api\v1\urls\accounts.py", line 5, in <module> from .. import views File "C:\Users\ASUS\OneDrive\Desktop\django\Django-Advance\core\accounts\api\v1\views.py", line 4, in <module> from rest_framework.authtoken.views import ObtainAuthToken File "C:\Users\ASUS\OneDrive\Desktop\django\Django-Advance\venv\Lib\site-packages\rest_framework\authtoken\views.py", line 11, in <module> class ObtainAuthToken(APIView): File "C:\Users\ASUS\OneDrive\Desktop\django\Django-Advance\venv\Lib\site-packages\rest_framework\authtoken\views.py", line 21, in ObtainAuthToken coreapi.Field( ^^^^^^^^^^^^^ AttributeError: 'NoneType' object has no attribute 'Field'
依赖配置(requirements.txt)
# general modules django<4.3,>4.2 python-decouple Pillow # third party modules djangorestframework markdown django-filter drf-yasg[validation] djangorestframework-simplejwt[crypto] # deployment modules
原自定义CustomObtainAuthToken类
class CustomObtainAuthToken(ObtainAuthToken): serializer_class = CustomAuthTokenSerializer def post(self, request, *args, **kwargs): serializer = self.serializer_class( data=request.data, context={"request": request} ) serializer.is_valid(raise_exception=True) user = serializer.validated_data["user"] token, created = Token.objects.get_or_create(user=user) return Response( { "user_id": user.pk, "email": user.email, "token": token.key, } )
内容的提问来源于stack exchange,提问作者ali.m.n.2003
相关产品推荐
相关产品推荐

