Django REST框架认证配置问题:用户创建POST接口返回500错误(AssertionError:视图返回NoneType)
解决Django REST框架创建用户时返回NoneType的AssertionError问题
看起来你的问题出在两个地方:序列化器的create方法逻辑不严谨,以及视图中存在潜在的无返回分支,导致Django REST Framework无法获取到合法的Response对象,从而抛出AssertionError。
问题分析
- 序列化器的create方法:当前代码中只有当
password不为None时才会保存用户实例,但你的序列化器已经要求password是必填字段(CharField默认required=True),所以这个判断完全多余,反而可能因为意外情况导致实例未被保存到数据库。 - 视图的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
相关产品推荐
相关产品推荐

