Ajax请求未返回HttpResponse

时间:2018-10-06 20:41:23

标签: javascript python ajax django

我正在编写只有一页的django网络应用程序。此页面包含带有一些输入的表单。当我单击提交按钮时,我对python中的函数进行了ajax调用。我想从该函数取回一些数据。

HTML文件:

<form id="strategy" method="post" class="edit_user">
  {% csrf_token %}
  <div class="sel-schedule">
    <label>Label: </label>
    <input id="start_time" type="time" name="start_time" value="09:30" required>
  </div>
  <button type="submit" class="inactive boton-lanzar">Launch</button>
</form>

JS文件

$('#strategy').on('submit', function(event){
    var start_time = document.getElementsByName("start_time")[0].value;
    var url = '/method_calculation/';
    $.ajax(url, {
        data: {
            'start_time': start_time,
        },
        dataType: 'json',
        success: function (data) {
          console.log("new")
        }
    })
});

网址文件:

urlpatterns = [
path('admin/', admin.site.urls),
path('', home, name='home'),
path('method_calculation/', method_calculation, name="method_calculation"),
]

查看文件:

def home(request):
    if request.method == "GET":
        return render(request, 'index.html')
    else:
        return HttpResponse("OK")


def method_calculation(request):
    if request.method == 'POST':

        start_time_hour = int(request.POST.get('start_time')[0:2])
        start_time_minute = int(request.POST.get('start_time')[3:5])
        data_comparison = caculate_summit(start_time_hour, start_time_minute)

        args = {data_comparison}
        return JsonResponse(args)

我有点困惑。

首先,我不希望页面重新加载,但是如果我取出返回的HttpResponse,它说它需要它。

第二,使用当前文件,我得到以下错误:

The view myapp.views.method_calculation didn't return an HttpResponse object. It returned None instead.

我想念什么?

非常感谢

2 个答案:

答案 0 :(得分:1)

您的AJAX调用正在发出GET请求,并且view函数无法处理这种情况。结果,它返回None,从而返回错误。

因此,您需要在$.ajax调用中指定请求类型:

$.ajax(url, {
    type: "POST",
    data: {
        start_time: start_time,
        csrfmiddlewaretoken: '{{ csrf_token }}'
    },
    dataType: 'json',
    success: function (data) {
      console.log("new")
    }
})

根据您的评论,您还需要指定CSRF令牌(鉴于JavaScript是用模板呈现的,上面的方法应该可以使用)。

答案 1 :(得分:1)

当我在Django项目上的Ajax中执行发布请求时,这就是我正在做的事情。 根据django文档(https://docs.djangoproject.com/en/2.1/ref/csrf/),获取csrf令牌的最佳方法是使用此函数:

function getCookie(name) {
    var cookieValue = null;
    if (document.cookie && document.cookie !== '') {
        var cookies = document.cookie.split(';');
        for (var i = 0; i < cookies.length; i++) {
            var cookie = jQuery.trim(cookies[i]);
            // Does this cookie string begin with the name we want?
            if (cookie.substring(0, name.length + 1) === (name + '=')) {
                cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                break;
            }
        }
    }
    return cookieValue;
}

function csrfSafeMethod(method) {
    // these HTTP methods do not require CSRF protection
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method));
}

我用以下代码构建了一个ajax发布函数:

function postAjaxJson(url, data, is_csrf, callback) {
    if (is_csrf) {
        var csrftoken = getCookie('csrftoken');
        $.ajaxSetup({
            beforeSend: function(xhr, settings) {
                if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
            }
        });
    }
    $.ajax({
        url: url,
        type: "POST",
        contentType: "application/json",
        data: JSON.stringify(data),
        success: function(response) {
            callback(response);
        },
        error: function () {
            console.error("Erreur réseau avec l'url" + url);
        }
    })
}

我通常以JSON发送数据。 而且,在您看来,您会在 request.body 中找到ajax帖子中的数据,而不是在request.POST中找到数据:

import json
def method_calculation(request):
    if request.body:

        ...
        # if json data = json.loads(request.body)
        ...
        return JsonResponse(args)

我希望这可以帮助您解决问题!