【问题标题】:Ajax or Django Rest Framework is acting weird with Post DataAjax 或 Django Rest 框架对 Post Data 的行为很奇怪
【发布时间】:2021-07-17 19:47:24
【问题描述】:

我正在使用 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?

【问题讨论】:

  • 你在哪里看到转换后的结果?您的预期结果是什么?
  • 我在 Django 中看到了转换后的结果,我正在尝试使用 Django 将第一个 json 数据保存在 DB 中,但它正在将其转换为服务器中的第二个 JSON,这根据定义的序列化程序无效
  • 可以分享一下相关的DRF代码吗? (比如你的模型、视图和序列化器)
  • @KutayAslan 添加了!

标签: javascript jquery django ajax django-rest-framework


【解决方案1】:

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

    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,所以没有意义)实例 .data 以错误的格式返回。这可能是由下面的序列化器实例化引起的:

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

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

【讨论】:

  • 我遇到了问题,这是因为没有将请求作为列表发送,我正在发送多个待办事项,这些待办事项每 10 分钟或注销一次请求中缓存在本地存储中。我在中间件中转换了验证部分,它正在正确验证,我已经为模型中的用户创建了外键。感谢您抽出时间帮助我!!!
猜你喜欢
  • 1970-01-01
  • 2016-04-27
  • 1970-01-01
  • 2012-10-25
  • 2016-05-23
  • 2012-03-18
  • 1970-01-01
  • 2011-07-15
  • 1970-01-01
相关资源
最近更新 更多