为啥我在 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 请求错误?的主要内容,如果未能解决你的问题,请参考以下文章

Django jquery ajax 返回403

为啥我在运行 Locust 时收到 403 错误?

Django 在发送 POST 请求时返回 403 错误

为啥我在使用 img 标签时会收到 403 禁止?

为啥我在本地使用 codeigniter 会收到 403 Forbidden 错误?

为啥我在尝试访问此 WordPress 网站时收到此 403 Forbidden 错误?为啥它无法读取 .htaccess 文件?