【问题标题】:Why I get 403 POST request error at Django?为什么我在 Django 收到 403 POST 请求错误?
【发布时间】:2019-10-28 12:15:32
【问题描述】:

为什么我收到 403 POST 请求错误?

我不明白这里有什么问题......

$('#id_submit').click(function(e) {
  e.preventDefault();
  var form = new FormData($('form')[0])
  form.append("image", $("input#id_image")[0].files[0])

  var data = {
    form: form,
    image_form: 123
  }

  $.ajax({
    headers: '{{ csrf_token }}',
    type: 'POST',
    data: data,
    processData: false,
    contentType: false
  })
})

【问题讨论】:

  • 标头应该是键和值。试试:'X-CSRFToken: {{ csrf_token }}'。
  • 403 响应可能也有正文。检查实际的错误消息。在设置中使用 DEBUG=True ;)

标签: jquery django ajax csrf


【解决方案1】:

您没有正确设置{{ csrf_token }},您需要将其注入POST 数据中,或者作为X-CSRFToken 标头,而不是作为整个 headers。参见例如Django documentation on Setting the token on the AJAX request

在 POST 数据

var data = {
    form: form,
    image_form: 123,
    csrfmiddlewaretoken: '{{ csrf_token }}'
}

在 POST 标头

或者我们可以将其包含在帖子标题中,例如:

$.ajax({
    headers: {'X-CSRFToken': '{{ csrf_token }}' },
    type: 'POST',
    data: data,
    processData: false,
    contentType: false
});

【讨论】:

  • 告诉我如何获取request.POST中的数据?那里是空的 (request.POST.viewkeys())...
  • @ДмитрийДмитрук:您需要从表单字段中提取数据,而不仅仅是提交form。所以你需要获取这些值,并用这些值组成一个字典。
  • @ДмитрийДмитрук:你为什么在false上设置processData
  • 我得到Illegal invocation,如果processData不是false
  • @ДмитрийДмитрук:是的,这是因为,如前所述,您需要获取 input 元素中的值,并构造一个字典。您不能将表单“发送”到服务器,您只能将值发送到服务器。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-10-04
  • 1970-01-01
相关资源
最近更新 更多