Django REST Framework头像上传接口Postman调用报错如何解决
问题原因及解决方案
1. CSRF校验失败(最高发原因)
DRF自带的测试UI会自动携带当前站点的CSRF令牌,Postman默认不会携带,如果你的接口用了Session认证就会触发校验失败。
两种修复方案二选一即可:
- 测试时在Postman请求头新增
X-CSRFToken字段,值从站点Cookie的csrftoken字段中获取; - 更建议切换为Token认证,无需处理CSRF,在
settings.py中配置:
REST_FRAMEWORK = { 'DEFAULT_AUTHENTICATION_CLASSES': [ 'rest_framework.authentication.TokenAuthentication', 'rest_framework.authentication.SessionAuthentication', ] }
配置完成后Postman请求头新增Authorization: Token <对应用户的Token值>即可完成认证。
2. Postman请求格式配置错误
文件上传必须用form-data格式,按以下步骤配置:
- 请求方法选POST,Body标签页选中
form-data - Key列新增两个参数:
user(值为对应用户ID)、profile_pic_path,注意profile_pic_path对应的Key类型要切换为File(默认是Text,鼠标hover到Key输入框右侧会出现下拉选项),Value列选择本地要上传的图片即可。
3. 序列化器要求传user字段,请求未携带
你当前用fields = '__all__'会把user字段暴露为必填参数,DRF自带UI登录状态下会自动关联当前用户,Postman如果没传user就会报错。
优化方案:后端直接从登录态取用户,不需要前端传参:
- 修改序列化器,把
user设为只读字段:
class ProfilePictureSerializer(serializers.ModelSerializer): class Meta: model = ProfilePicture fields = '__all__' read_only_fields = ['user']
- 修改视图的create方法,自动绑定当前登录用户:
def create(self, request, *args, **kwargs): serializer = self.get_serializer(data=request.data) if serializer.is_valid(): # 新增user参数,从请求中取当前登录用户 serializer.save(user=request.user) custom_data = { "status": True, "message": 'Successfully uploaded your profile picture.', "data": serializer.data } return Response(custom_data, status=status.HTTP_201_CREATED) else: custom_data = { "status": False, "message": serializer.errors, } return Response(custom_data, status=status.HTTP_200_OK)
内容的提问来源于stack exchange,提问作者Aryan VR
相关产品推荐
相关产品推荐

