Django DRF接口部署Heroku出现WSGIRequest无get属性错误如何解决
问题根因
错误的核心原因是你实例化序列化器时违反了DRF的参数规范:serializers.ModelSerializer的context参数要求传入字典类型,但你在视图的get方法中直接传入了request请求对象。
DRF内部存在大量对context的字典操作逻辑,比如序列化ImageField/FileField类型字段时,会自动调用context.get('request')获取请求对象来拼接资源的绝对访问地址,而原生WSGIRequest对象没有字典的get方法,因此触发了本次报错。
本地环境运行正常是因为本地调试时大概率没有触发调用context.get的逻辑:比如本地测试的文章image字段为空、或者本地DRF配置了UPLOADED_FILES_USE_URL = False不需要生成资源绝对URL,而Heroku环境的配置/数据触发了该逻辑,因此暴露了问题。
修复方案
需要修改两处代码:
- 修正视图中序列化器的传参逻辑,将
context改为字典格式,把request对象存入字典的request键:
# 原错误代码 # serializer = self.serializer_class(post, context=request) # 修正后代码 serializer = self.serializer_class(post, context={'request': request})
- 修正序列化器
create、update方法中读取上下文用户的逻辑,先从context字典中取出request对象,再读取user属性:
# create方法原错误代码 # post = Post.objects.create(**validated_data, owner=self.context.user) # 修正后代码 post = Post.objects.create(**validated_data, owner=self.context['request'].user) # create方法中标签创建逻辑的原错误代码 # owner=self.context.user # 修正后代码 owner=self.context['request'].user # update方法中标签创建逻辑的原错误代码 # owner=self.context.user # 修正后代码 owner=self.context['request'].user
修复后重新部署即可解决该报错。
内容的提问来源于stack exchange,提问作者Lutaaya Huzaifah Idris
相关产品推荐
相关产品推荐

