【问题标题】:Ajax not getting sucess reponse from django back-endAjax 没有从 django 后端获得成功响应
【发布时间】:2021-01-06 16:29:41
【问题描述】:

我正在尝试以下要求,其中有一个语音合成器,它将我的声音(这是一个问题)转换为文本,并通过 Ajax 将该文本发送到后端 Django。

在后端,Django 获取该数据并使用该数据(问题)访问数据库并获取结果并将该结果发送到应该被 Ajax 的成功部分捕获的前端。但它不起作用。

我无法弄清楚问题出在哪里。我在下面发布 Ajax 和 Django 代码供您参考。

views.py

def GetAnswer(request):
    if request.method=='GET' and request.is_ajax():
        question_asked=str(request.GET.get("message_now"))
        try:
            answer=QuestionAnswer.objects.filter(question=question_asked).value_list('answer', flat=True)[0]
            print(answer)
            data={"data":answer}

            return JsonResponse({"success": True}, data, status=200)
        except:

            return JsonResponse({"success": False}, status=400)
    else:
        print("Not Suceess")

ma​​in.js

function chatbotvoice(message) {
  const speech = new SpeechSynthesisUtterance();

  if (message !== null && message !== '') {
    $.ajax({
      url: "http://127.0.0.1:8000/getanswer",
      type: 'GET',
      data: {
        message_now: message
      },
      success: function (data) {
        speech.text = JSON.parse(data);
        window.speechSynthesis.speak(speech);
        chatareamain.appendChild(showchatbotmsg(speech.text));
      },
      error: function (error) {

        speech.text = "Oh No!! I don't Know !! I am still learning!! Your question got recorded and answer for your question will be available with me in 24 hours";
        window.speechSynthesis.speak(speech);
        chatareamain.appendChild(showchatbotmsg(speech.text));
      },
    });
  }
}

我尝试检查 Ajax 请求是否到达函数,并且我能够在后端查看变量“question_asked”的值。

【问题讨论】:

  • 终端显示什么错误
  • 我收到错误为“错误请求:/getanswer/”
  • 显示url.py的代码
  • urlpatterns = [ path('', views.QuestionAnswer, name='QuestionAnswer'), path('getanswer/', views.GetAnswer, name = 'getanswer'), ]+ static(settings .STATIC_URL, document_root=settings.STATIC_ROOT)

标签: javascript jquery django ajax django-views


【解决方案1】:
return JsonResponse({"success": True}, data, status=200)

该行将失败并显示一些错误消息,因为您将数据作为第二个位置参数传递。 Django 文档告诉你第二个位置参数是encoder。由于包含数据的列表不是编码器 - 您会收到错误消息。

你的错误会被 try/except 块捕获。因此,执行流程将移至 except 块 - 您在此处返回 {"success": false} JSON 响应。

所以你的代码应该变成这样:

def GetAnswer(request):
    if request.method=='GET' and request.is_ajax():
        question_asked=str(request.GET.get("message_now"))
        try:
            answer=QuestionAnswer.objects.filter(question=question_asked).value_list('answer', flat=True)[0]
            print(answer)
            data={"data":answer}

            return JsonResponse({"success": True, "data": data}, status=200)
        except:

            return JsonResponse({"success": False}, status=400)
    else:
        print("Not Suceess")

请参阅这部分文档以获取更多详细信息https://docs.djangoproject.com/en/3.1/ref/request-response/#jsonresponse-objects


更新(21.09.2020)

你应该修复这条线:

answer=QuestionAnswer.objects.filter(question=question_asked).value_list('answer', flat=True)[0]

answer=QuestionAnswer.objects.filter(question=question_asked).values_list('answer', flat=True)[0]

因为没有value_list函数,但是有values_list

更新 2 (21.09.2020)

所以最终的代码应该是:

def GetAnswer(request):
    if request.method == 'GET' and request.is_ajax():
        question_asked = request.GET["message_now"]
        try:
            answer = QuestionAnswer.objects.filter(question=question_asked).values_list('answer', flat=True)[0]
            return JsonResponse({"success": True, "answer": answer}, status=200)
        except:
            return JsonResponse({"success": False}, status=400)

JS代码也要修改

function chatbotvoice(message) {
  const speech = new SpeechSynthesisUtterance();

  if (message !== null && message !== '') {
    $.ajax({
      url: "http://127.0.0.1:8000/getanswer",
      type: 'GET',
      data: {
        message_now: message
      },
      success: function (data) {
        if (data.success == true){
          speech.text = data.answer;
          window.speechSynthesis.speak(speech);
          chatareamain.appendChild(showchatbotmsg(speech.text));
        } else {
          speech.text = "Oh No!! I don't Know !! I am still learning!! Your question got recorded and answer for your question will be available with me in 24 hours";
          window.speechSynthesis.speak(speech);
          chatareamain.appendChild(showchatbotmsg(speech.text));
        }
      },
      error: function (error) {
        speech.text = "Oh No!! I don't Know !! I am still learning!! Your question got recorded and answer for your question will be available with me in 24 hours";
        window.speechSynthesis.speak(speech);
        chatareamain.appendChild(showchatbotmsg(speech.text));
      },
    });
  }
}

【讨论】:

  • print(answer) 没有打印任何内容....我检查过了...没有打印任何值
  • 您是否在浏览器控制台或 Django 日志中看到错误请求?你能设置 DEBUG=True 再试一次吗?
  • 我的意思是在我正在运行这个项目的命令提示符中......并且已经是 DEBUG=True
  • 那你能打开那个APIon browser tab来查看错误详情吗?
  • 我是 django 的新手,我不知道该怎么做...你能帮帮我吗?
【解决方案2】:
$.ajax({
  crossDomain: true,
  url: "{% url 'getanswer' %}",
  type: 'GET',
  data: {
    message_now: message,
    'csrfmiddlewaretoken': '{{ csrf_token }}'
  },

【讨论】:

  • Surya,,Ajax 能够将我的数据带到后端......但它不会将数据发送回 ajax 成功
  • 兄弟..它只打印“Bad Request:/getanswer/”和 404
  • 问题是失败部分正在发挥作用......但问题在于成功部分
  • 例外为 e: print(e)
  • 'function' object has no attribute 'objects' --> 我得到这个错误
猜你喜欢
  • 2015-11-30
  • 2019-04-22
  • 2016-11-09
  • 2015-05-07
  • 1970-01-01
  • 2021-12-20
  • 1970-01-01
  • 2013-09-05
  • 1970-01-01
相关资源
最近更新 更多