Javascript 获取api-400未能加载资源
在向我的RESTAPI发出PUT请求时,它会向客户端返回一个带有400个错误请求的序列化响应负载Javascript 获取api-400未能加载资源,javascript,ajax,django-rest-framework,fetch,Javascript,Ajax,Django Rest Framework,Fetch,在向我的RESTAPI发出PUT请求时,它会向客户端返回一个带有400个错误请求的序列化响应负载 {'vote': [ErrorDetail(string='Duplicate vote not allowed', code='vote_error')]} (Pdb) c Bad Request: /api/v1/questions/3/ [15/May/2021 09:41:24] "PUT /api/v1/questions/3/ HTTP/1.1" 400 39 但是
{'vote': [ErrorDetail(string='Duplicate vote not allowed', code='vote_error')]}
(Pdb) c
Bad Request: /api/v1/questions/3/
[15/May/2021 09:41:24] "PUT /api/v1/questions/3/ HTTP/1.1" 400 39
但是,当浏览器返回响应时,它会返回:
加载资源失败:服务器在收到上述响应负载的同时以400(错误请求)的状态响应。
?当此错误成功命中API时引发此错误的原因是什么?如何处理此错误
您已经在服务中设置了一个
ValidationError
,以避免用户执行重复投票。因此,如果被触发,您的API将返回一个400
错误和自定义错误消息
在前端,
fetch
将接收此错误以及相关的有效负载。您需要做的是使用捕获处理此错误(然后使用处理成功)。签出这是一个验证错误。您可能对“投票”字段施加了唯一的约束,并且您正在发送重复的数据。错误不在您发布的代码中。请参阅APIView及其序列化程序。不确定问题是什么,API返回所需的响应。验证错误在VoteSerializer-validate_vote()中提出。您发送的“投票”值与数据库中已有的值相同。如果您收到错误代码为400的验证错误,我看不出您是如何得到所需的响应的……我正在试图绕过用户滥用投票功能。防止用户在同一方向上连续多次向上/向下投票某个主题。这就是提高ValidationError的意图,如果发生了,我会认为这是一个糟糕的请求。换言之,不允许连续进行3次向下/向上投票。你建议如何处理这个案件?
> c:\users\..\questions\views.py(266)put()->None
-> if serializer.is_valid(raise_exception=True):
n
(Pdb) rest_framework.exceptions.ValidationError: {'vote': [ErrorDetail(string='Duplicate vote not allowed', code='vote_error')]}
> c:\users\..\views.py(506)dispatch()
-> response = handler(request, *args, **kwargs)
class UserQuestionVoteView(APIView):
throttle_scope = "voting"
def put(self, request, id):
import pdb; pdb.set_trace()
account = UserAccount.objects.get(user=request.user)
question = get_object_or_404(Question, id=id)
if account == question.user_account:
return Response(data={
'vote': "Cannot vote on your own question"
}, status=400)
try:
stored_vote = QuestionVote.objects.get(
account=account, question=question
)
serializer = QuestionVoteSerializer(stored_vote, request.data)
except QuestionVote.DoesNotExist:
serializer = QuestionVoteSerializer(data=request.data)
finally:
if serializer.is_valid(raise_exception=True):
question_vote = serializer.save(
account=account,
question=question
)
vote = serializer.validated_data['vote']
if vote == "downvote":
question.vote_tally = F('vote_tally') - 1
else:
question.vote_tally = F('vote_tally') + 1
question.save()
question.refresh_from_db()
return Response(data={
'id': question.id,
'tally': question.vote_tally
}, status=200)
return Response(serializer.errors, status=400)
class VoteSerializer(serializers.Serializer):
id = serializers.IntegerField(read_only=True)
vote = serializers.CharField(write_only=True)
def validate_vote(self, value):
if self.instance and (value == self.instance.vote):
raise ValidationError("Duplicate vote not allowed", code="vote_error")
return value