【问题标题】:Ajax Post Request Error using django 1.10.5使用 django 1.10.5 的 Ajax 发布请求错误
【发布时间】:2018-01-05 08:39:21
【问题描述】:

在过去一周左右的时间里,我一直在努力成功实现一个 jQuery ajax 请求,以将数据从我的 Annualgoals.html 中的 javascript 函数传递到 django 视图,以便将数据保存到我的数据库中。目前我只是试图通过在 django 端打印数据来测试数据传输。

我已经检查了以下线程,但看不到任何显示与我看到的相同错误的线程(我几乎可以肯定缺少一些明显的东西)。

Forbidden (CSRF token missing or incorrect) Django error

"CSRF token missing or incorrect" while post parameter via AJAX in Django

虽然缺少 CSRF 令牌是我的第一个问题,但 StackOverflow 和 django 文档上的答案很好地解释了必须做什么才能确保包含 csrf 令牌。但是,按照推荐的步骤,我收到以下 django 错误:

response.set_cookie(settings.CSRF_COOKIE_NAME, AttributeError: 'NoneType' 对象没有属性 'set_cookie'

我的代码如下:

年度目标.html

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));
      }

var data = [1, 2, 3, 4]
var csrftoken = getCookie('csrftoken');

// Ajax Setup

    $.ajaxSetup({
       beforeSend: function(xhr, settings) {
          if (!csrfSafeMethod(settings.type) && !this.crossDomain) {
                    xhr.setRequestHeader("X-CSRFToken", csrftoken);
                }
          }
    });

 // Ajax Call

    $.ajax({
      type: 'POST',
      url: "{% url 'LifeAdmin:saveAnnualGoals' %}",
      data: {'data[]': data},
    });

views.py

@ensure_csrf_cookie
@login_required
def saveAnnualGoals(request):
   if request.method == 'POST':
       data = request.POST.get('data')
   print(data)

urls.py

url(r'^saveAnnualGoals$', views.saveAnnualGoals, name='saveAnnualGoals')

我正在使用 Django 1.10.5 和 Python 3.6.1

任何帮助将不胜感激!

谢谢:)

【问题讨论】:

  • 尝试使用@ensure_csrf_cookie 装饰器来呈现页面,用户将从该页面发出ajax 请求。

标签: jquery python ajax django django-views


【解决方案1】:

您的视图需要返回一个响应。使用您的实际代码,视图不会返回任何内容,因此 None。 Django 然后尝试将 cookie 添加到响应中,但由于它是无,您会收到您发布的错误消息。

例子:

return HttpResponse(status=200)

【讨论】:

  • 非常感谢!不敢相信这是这么简单的事情! :)
猜你喜欢
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-14
  • 2015-03-10
  • 1970-01-01
  • 2014-01-25
相关资源
最近更新 更多