Django DRF报错:'Request' object has no attribute 'get'排查求助
Django DRF:
'Request' object has no attribute 'get' 错误排查求助 我在开发基于Django DRF的应用API项目时,遇到一个难以调试的错误:'Request' object has no attribute 'get'。该错误在更新组织后触发,经排查确定来自OrganisationDetail视图的patch方法。
错误有两个特殊点:
- 本地环境从未出现该错误,仅部署到GCP staging环境时触发;
- 用户仍能成功创建,但patch请求返回500响应。
目前日志尚未同步到GCP Stackdriver,仅能通过前端API客户端获取错误信息。我已尝试移除视图patch方法中所有的.get()方法,改用try-except处理字典取值,但问题依旧,恳请提供排查思路。
相关视图代码
class OrganisationDetail(generics.RetrieveUpdateDestroyAPIView): """ Retrieve, update or delete an organisation. """ permission_classes = (IsAuthenticated, IsInOrg) queryset = Organisation.objects.all() serializer_class = OrganisationSerializer logger.info("Init log from organisation view") def get_object(self, pk): try: return Organisation.objects.get(pk=pk) except Organisation.DoesNotExist: return HttpResponse(status=404) def get(self, request, pk, format=None): organisation = self.get_object(pk) serializer = OrganisationSerializer(organisation) return Response(serializer.data) def patch(self, request, pk, format=None): try: organisation = self.get_object(pk) data = copy.deepcopy(request.data) member_to_remove = request.data.get( 'user_to_remove', 'no_user_to_remove') if member_to_remove != 'no_user_to_remove': data['member_to_remove'] = member_to_remove if "name" not in data: data["name"] = organisation.name if "description" not in data: data["description"] = organisation.description serializer = OrganisationSerializer( organisation, data=data, context=request, partial=True) if serializer.is_valid(): serializer.save() logger.info(f"PATCH SUCCESSFUL: {serializer.data}") return Response(serializer.data) logger.warning(f"PATCH Failed: {serializer.errors}") return JsonResponse(serializer.errors, status=400) except Exception as e: logger.error(f"PATCH Failed with exception: {e}") return JsonResponse({'error': str(e)}, status=500)
序列化器代码
class OrganisationSerializer(serializers.Serializer): id = serializers.ReadOnlyField() name = serializers.CharField() description = serializers.CharField() owner = serializers.CharField() members = MemberSerializer(many=True, read_only=True) new_member = MemberSerializer(required=False) class Meta: model = Organisation fields = [ 'id', 'owner', 'name', 'description', 'members' ] def create(self, validated_data): """ Create and return a new `Organisation` instance, given the validated data. """ # an organisation needs the owner to exist # so first we create the owner as an # inactive user and send them an activation email user = create_user_for_organisation( validated_data['owner'], "ADMIN" ) user.save(update_fields=["is_active"]) org_data = { "owner": user, "name": validated_data['name'], "description": validated_data['description'] } try: org = Organisation.objects.create(**org_data) org.members.set([user]) org.save() except Exception as e: print('Failed to create Organisation', e) send_user_activation_email(user, self.context['request']) send_owner_confirmation_email(user, self.context['request']) return org def update(self, instance, validated_data): try: instance.name = validated_data.get('name', instance.name) owner = User.objects.get( email=validated_data.get('owner', instance.owner.email)) instance.owner = owner new_member_details = validated_data.get('new_member') if new_member_details != None: new_member = create_user_for_organisation( new_member_details['email'], new_member_details['role']) instance.members.add(new_member) send_user_activation_email(new_member, self.context) member_to_remove_id = QueryDict.get( self.initial_data, key='user_to_remove') if member_to_remove_id != None: try: content_lock = ContentLock.objects.get( user_id=member_to_remove_id) content_lock.delete() except: pass user_to_remove = User.objects.get(id=member_to_remove_id) instance.members.remove(user_to_remove) instance.save() return instance except Exception as e: logger.error( f"Serializer Failed to update organisation with exception: {e}") return JsonResponse({'error': str(e)}, status=500) def validate(self, data): try: user = self.context['request'].user except Exception: user = self.context.user except Exception: user = self.context if not user: raise serializers.ValidationError("User not found.") if not Organisation.objects.has_create_permission(user): if not Organisation.objects.has_update_permissions(user, self.instance.owner.email): raise serializers.ValidationError( "User not allowed to create or update organisation.") cleandata = data if 'members' in self.initial_data: if isinstance(self.initial_data['members'], list): cleandata['members'] = self.initial_data['members'] else: cleandata['members'] = [] cleandata['members'].append(self.initial_data["members"]) return cleandata
内容的提问来源于stack exchange,提问作者Che Coelho
相关产品推荐
相关产品推荐

