Ajax或Django Rest Framework在使用Post Data时表现得很奇怪



我正在用jQuery/JS前端和Django/DRF后端构建一个看板板。

我正在向服务器发送POST AJAX请求

function login(email, password) {
var d = {
"email": email,
"password": password
}
d = JSON.stringify(d)
console.log(d)
return $.ajax({
url: "api/accounts/login/",
type: "POST",
data: d,
dataType: "json",
}).then((response) => {
var data = JSON.parse(response);
return data;
}).fail((response) => {
return false;
})
}

但是当服务器收到请求时,这个

{"email":"satyam@gmail.com","password":"satyam@789"}

转换为

'{"email": "satyam@gmail.com", "password": "satyam@789"}': ['']}'

Django代码

class TodoView(ListCreateAPIView):
queryset = Todo.objects.all()
serializer_class = TodoSerializer
permission_classes = (IsAuthenticated,)
def post(self, request):
token = request.META.get('HTTP_AUTHORIZATION', " ").split(' ')[1]
data = {'token': token}
try:
valid_data = VerifyJSONWebTokenSerializer().validate(data)
user = valid_data["user"]
request.user = user
except ValidationError as v:
print("Validation Error", v)
serializer = self.serializer_class(data=request.data, many=True)
if serializer.is_valid():
print(request.data)
serializer.save(user=request.user)
return Response({"todo": serializer.data})
return Response({"error": "Invalid Data"})

是什么问题导致了这种情况?

是Javascript还是DRF?

首先,如果您已经登录(这意味着您有一个有效的令牌,所以您的请求将其放入您的身份验证所需视图中,那么您不需要再次尝试登录(我想这就是您要做的(。因此,下面的代码是多余的/错误的,应该从您的视图中删除。

token = request.META.get('HTTP_AUTHORIZATION', " ").split(' ')[1]
data = {'token': token}
try:
valid_data = VerifyJSONWebTokenSerializer().validate(data)
user = valid_data["user"]
request.user = user
except ValidationError as v:
print("Validation Error", v)

我猜你说的是TodoSerializer(可能有电子邮件和密码字段,这也没有意义,因为这些字段在语义上不属于ToDo(实例。数据以错误的格式返回。这可能是由下面的序列化程序实例化引起的:

serializer = self.serializer_class(data=request.data, many=True)

many=True应该从那里删除,因为您的有效负载不是列表。这可能会解决你的问题。

最新更新