如何解决django-rest-framework注册流程中头像无法正常上传的问题
注册环节头像无法上传问题排查及解决方案
核心错误1:序列化器取值逻辑错误
你在CustomRegisterSerializer的save方法中使用self.data获取字段值,这是错误的写法:
DRF中self.data是序列化后的输出数据,ImageField这类二进制文件对象仅会保存在经过验证的self.validated_data中,从self.data取值只能拿到空值,导致头像无法写入用户实例。
修复方法:
修改serializers.py中CustomRegisterSerializer的save方法:
@transaction.atomic def save(self, request): user = super().save(request) # 从validated_data而非data取值 user.gender = self.validated_data.get('gender') user.phone_number = self.validated_data.get('phone_number') user.image = self.validated_data.get('image') user.save() return user
可能的错误2:缺少文件上传所需的解析器
上传文件要求请求格式为multipart/form-data,DRF默认如果没有配置对应解析器,会无法解析请求中的文件字段。你更新接口正常是因为用户更新接口默认带了对应解析器,而dj-rest-auth的注册接口默认没有配置。
修复方法:
在settings.py的REST_FRAMEWORK配置项中添加解析器配置:
REST_FRAMEWORK = { 'DEFAULT_PERMISSION_CLASSES': [ 'rest_framework.permissions.IsAuthenticated', ], 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.SessionAuthentication', 'rest_framework.authentication.TokenAuthentication', 'dj_rest_auth.jwt_auth.JWTCookieAuthentication', ], # 新增解析器配置 'DEFAULT_PARSER_CLASSES': [ 'rest_framework.parsers.JSONParser', 'rest_framework.parsers.FormParser', 'rest_framework.parsers.MultiPartParser', ], }
检查点:前端请求格式要求
前端发起注册请求时,必须指定请求头Content-Type: multipart/form-data,不能使用application/json格式,JSON无法传递二进制文件数据,会导致文件字段丢失。
内容的提问来源于stack exchange,提问作者CodingRaz
相关产品推荐
相关产品推荐

