python - 对 DRF api 的 Ajax 调用“从请求的数据流中读取后,您无法访问正文”
问题描述
您好,在用户单击表单上的保存按钮后,我正在尝试使用 Ajax 向我的 Django Rest Framework api 发送 POST 请求(包括 json 数据) 。我尝试使用邮递员并且它有效但是当我使用 ajax 调用它时它引发了RawPostDataException错误
我在views.py中的api:
class FilterView(APIView):
authentication_classes = [SessionAuthentication, JWTAuthentication]
permission_classes = [IsAuthenticated]
def get(self, request):
login_user = request.user
paginator = ListPagination()
queryset = Filter.objects.filter(user=login_user).all().order_by('-pk')
context = paginator.paginate_queryset(queryset, request)
serializer = FilterSerializer(context, many=True)
return paginator.get_paginated_response(serializer.data)
def post(self, request):
login_user = request.user
received_json_data=json.loads(request.body)
valid_ser = FilterSerializer(data=received_json_data)
if valid_ser.is_valid():
post_data = received_json_data["data"]
filter = Filter.objects.create(data=post_data, user=login_user)
filter.save()
return JsonResponse({'code':'200','data': filter.id}, status=200)
else:
return JsonResponse({'code':'400','errors':valid_ser.errors}, status=400)
我的序列化器:
class FilterSerializer(serializers.ModelSerializer):
user = serializers.IntegerField(required=False, source="user.id")
def validate_data(self, data):
if type(data) is not dict:
raise serializers.ValidationError("invalid JSON object")
class Meta:
model = Filter
fields = ('__all__')
extra_kwargs = {'data': {'required': True}}
还有我在 html 中的 ajax 请求:
$('#save').click( function(event) {
event.preventDefault();
var type = $('#type').val();
var price_min = $('#price_min').val();
var price_max = $('#price_max').val();
var size_min = $('#size_min').val();
var size_max = $('#size_max').val();
var city = $('#city').val();
var district = $('#district').val();
var ward = $('#ward').val();
var street = $('#street').val();
var frontend_min = $('#front_end_min').val();
var frontend_max = $('#front_end_max').val();
var road = $('#road').val();
var floor = $('#floor').val();
var bedroom = $('#bedroom').val();
var living_room = $('#living_room').val();
var toilet = $('#toilet').val();
var direction = $('#direction').val();
var balcony = $('#balcony').val();
var filter_data = {
'type': type,
'price_min': price_min,
'price_max': price_max,
'size_min': size_min,
'size_max': size_max,
'city': city,
'district': district,
'ward': ward,
'street': street,
'frontend_min': frontend_min,
'frontend_max': frontend_max,
'road': road,
'floor': floor,
'bedroom': bedroom,
'living_room': living_room,
'toilet': toilet,
'direction': direction,
'balcony': balcony,
}
// console.log(filter_data);
$.ajax({
type: "POST",
url: "/api/filters/",
beforeSend: function (xhr) {
xhr.setRequestHeader('X-CSRFToken', '{{csrf_token}}');
},
data: JSON.stringify({"data": filter_data}),
success: function (data) {
if (data.code == 200) {
alert("added filter");
}
}
});
return false;
});
当我使用 Ajax 调用时,它会在我的 django 服务器上返回以下错误:
raise RawPostDataException("You cannot access body after reading from request's data stream")
web_1 | django.http.request.RawPostDataException: You cannot access body after reading from request's data stream
我试过了,它在我的邮递员上工作我不知道为什么它在 ajax 调用上不起作用
我读到了这个错误,并且有很多使用 request.data 而不是 request.body 的建议,但是当我在视图中使用它时,在 Ajax 调用它返回:
TypeError:JSON 对象必须是 str、bytes 或 bytearray,而不是 'QueryDict'
并在 POSTMAN 上返回错误:
"detail": "请求中不支持的媒体类型 \"text/plain\"。"
我有点坚持如何在 POSTMAN 和 Ajax 调用上进行这项工作,任何帮助都会很好
解决方案
我通过将 request.body 更改为 request.data 来修复它,并且还更改了我的 ajax 代码
收到的_json_data=request.data
和ajax代码:
$.ajax({
type: "POST",
url: "/api/filters/",
beforeSend: function (xhr) {
xhr.setRequestHeader('X-CSRFToken', '{{csrf_token}}');
},
contentType: "application/json",
dataType: 'json',
data: JSON.stringify({"data": filter_data}),
success: function (data) {
if (data.code == 200) {
alert("added filter");
}
}
});
推荐阅读
- html - 如何在 HTML 的中心对齐两个图像,彼此重叠?
- c++ - 将 2D 指针向量多态传递到函数中
- reactjs - 是否可以将 Parent 实例传递给 Child 组件到 props 属性?
- algorithm - 给定一个前序二叉树访问构造一个具有相同前序访问的二叉搜索树。(如果可能的话)
- ionic3 - ionic-native/serial serial.open() 导致 Ionic 3 出错
- google-chrome - webrtc h264视频乱码chrome
- android - 安卓通知不显示
- vba - 作为 csv 保存的一部分删除 VBA 中的空白列/行
- spring - Spring Netflix Eureka Server 以非法 URL 启动 intelliJ
- android - 如何将 ImageView 与 TextView 垂直居中,同时确保 TextView 有足够的空间显示?