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

Django REST框架认证配置问题:用户创建POST接口返回500错误(AssertionError:视图返回NoneType)

解决Django REST框架创建用户时返回NoneType的AssertionError问题

看起来你的问题出在两个地方:序列化器的create方法逻辑不严谨,以及视图中存在潜在的无返回分支,导致Django REST Framework无法获取到合法的Response对象,从而抛出AssertionError。

问题分析

  1. 序列化器的create方法:当前代码中只有当password不为None时才会保存用户实例,但你的序列化器已经要求password是必填字段(CharField默认required=True),所以这个判断完全多余,反而可能因为意外情况导致实例未被保存到数据库。
  2. 视图的post方法:虽然看起来有return,但如果serializer.save()返回的对象在布尔判断中意外为False(虽然理论上不会发生),就会导致这个分支没有返回值,最终视图返回None触发错误。

修复方案

1. 修正CustomUserSerializer的create方法

确保用户实例一定会被保存到数据库,去掉多余的password判断:

# serializers.py
from rest_framework_simplejwt.serializers import TokenObtainPairSerializer
from rest_framework import serializers
from .models import CustomUser

class CustomUserSerializer(serializers.ModelSerializer):
    email = serializers.EmailField(required=True)
    username = serializers.CharField()
    password = serializers.CharField(min_length=8, write_only=True)
    
    class Meta:
        model = CustomUser
        fields = ('email', 'username', 'password')
        extra_kwargs = {'password': {'write_only': True}}
        
    def create(self, validated_data):
        # 直接取出password,因为序列化器已经验证过它存在
        password = validated_data.pop('password')
        instance = self.Meta.model(**validated_data)
        instance.set_password(password)
        # 确保实例被保存到数据库
        instance.save()
        return instance

2. 简化CustomUserCreate视图的post方法

去掉不必要的if user:判断,因为serializer.save()调用create方法一定会返回用户实例,同时返回序列化后的用户数据(更符合REST规范):

# views.py
from rest_framework_simplejwt.views import TokenObtainPairView
from rest_framework.views import APIView
from rest_framework import status, permissions
from rest_framework.response import Response
from .serializers import TokenObtainPairSerializer
from rest_framework.generics import CreateAPIView
from .serializers import CustomUserSerializer, MyTokenObtainPairSerializer

class CustomUserCreate(APIView):
    permission_classes = (permissions.AllowAny,)
    
    def post(self, request, format='json'):
        serializer = CustomUserSerializer(data=request.data)
        if serializer.is_valid():
            serializer.save()
            # 返回序列化后的用户数据和201状态码
            return Response(serializer.data, status=status.HTTP_201_CREATED)
        # 验证失败时返回错误信息
        return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST)

为什么这样修改?

  • 序列化器的create方法去掉多余判断后,确保用户实例一定会被保存到数据库,避免出现未保存的实例返回给视图。
  • 视图中去掉if user:判断后,消除了潜在的无返回分支,保证只要验证通过就会返回合法的Response对象,完全符合DRF的视图要求。

这样修改后,你再发送POST请求创建用户时,应该就能正常返回201状态码和用户数据,不会再出现AssertionError了。

内容的提问来源于stack exchange,提问作者Willie Njati

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 13:17:36