为啥我在 Django 收到 403 POST 请求错误?

Posted

技术标签:

【中文标题】为啥我在 Django 收到 403 POST 请求错误?【英文标题】: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 ;) 【参考方案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 元素中的值,并构造一个字典。您不能将表单“发送”到服务器,您只能将值发送到服务器。

以上是关于为啥我在 Django 收到 403 POST 请求错误?的主要内容,如果未能解决你的问题,请参考以下文章