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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 08:30:19