Django REST Framework调用serializer.save()创建用户出现500内部错误
DRF调用serializer.save()创建用户返回500错误排查方案
可能故障原因
- Django内置
create_user方法参数顺序传递错误,内置方法默认参数顺序为create_user(username, email=None, password=None, **extra_fields),你当前代码将password放在第二个参数、email放在第三个参数,参数错位会触发字段校验失败报错 - 媒体存储目录权限异常,你使用
MultiPartParser接收头像上传,设备重启后可能MEDIA_ROOT对应目录的读写权限被重置,写入头像文件时触发IO错误 - 数据库状态异常,设备重启后数据库服务未正常启动,或新增的用户模型字段未执行数据库迁移,写入数据时触发数据库层面错误
- 序列化器取值逻辑错误,cellphone、sex等字段如果请求未传递,你直接用
validated_data["key"]硬取会触发KeyError - 视图状态码使用错误,校验失败返回304不符合HTTP规范,部分客户端或中间件会对304状态码做特殊处理,也可能引发异常
具体排查解决步骤
- 第一步先开启Django DEBUG模式,直接调用接口查看500错误的详细栈信息,可直接定位到具体错误类型与出错代码行
- 修正序列化器
create方法的参数传递逻辑,改用关键字参数避免顺序错误,同时用get方法取可选字段防止KeyError:
def create(self, validated_data): user = User.objects.create_user( username=validated_data["username"], email=validated_data["email"], password=validated_data["password"], cellphone=validated_data.get("cellphone"), sex=validated_data.get("sex"), first_name=validated_data.get("first_name"), last_name=validated_data.get("last_name"), profile_image=validated_data.get("profile_image"), ) return user
- 检查媒体目录权限,确认运行Django服务的用户对
settings.MEDIA_ROOT对应的目录有可读可写权限,Linux环境可执行chmod 755 你的媒体目录路径修正权限 - 检查数据库状态,确认数据库服务正常运行,执行
python manage.py showmigrations确认所有模型迁移都已应用,未应用的话执行python manage.py migrate完成迁移 - 修正视图的错误状态码,参数校验失败应返回400错误,把
status=status.HTTP_304_NOT_MODIFIED改为status=status.HTTP_400_BAD_REQUEST - 查看控制台打印的
request.data输出,确认请求参数包含所有必填字段,没有缺少字段或格式错误
内容的提问来源于stack exchange,提问作者kakakakakakakk
相关产品推荐
相关产品推荐

