Django-ajax:CSRF验证失败。请求中止

时间:2016-01-11 06:54:04

标签: ajax django ajaxform

我正在使用django服务器端表单来保存数据库中的详细信息。

Object

我正在使用ajax发布请求。

<form id="form_save_file" enctype="multipart/form-data">
{% csrf_token %}
      <label class="control-label col-md-4">File:</label>
        <div class="col-md-8">
            {{form.fa_file}}
        </div>
      <label class="control-label col-md-4">Name:</label>
        <div class="col-md-8">
            {{form.name}}
        </div>
</form>

我在settings.py中包含了中间件类

$("#form_save_file").submit(function(e) {
        $.ajax({

           type: "POST",
           url: '/url/',
           data: $("#form_save_file").serialize(),
           contentType: false, 
           processData: false,
           success: function(data){}
});

当我在ajax请求中删除MIDDLEWARE_CLASSES = ( 'django.middleware.common.CommonMiddleware', 'django.contrib.sessions.middleware.SessionMiddleware', 'django.middleware.csrf.CsrfViewMiddleware', 'django.contrib.auth.middleware.AuthenticationMiddleware', 'django.contrib.messages.middleware.MessageMiddleware', 'request.middleware.RequestMiddleware' ) contentType时,processData在views.py中为空,其他工作正常。

2 个答案:

答案 0 :(得分:2)

  

false的contentType选项用于多部分/表单数据表单   传递文件。

     

当将contentType选项设置为false时,它会强制jQuery   添加Content-Type标头,否则,边界字符串将是   失踪了。此外,通过多部分/表单提交文件时   必须将processData标志设置为false,否则,jQuery会   尝试将FormData转换为字符串,这将失败。

     

尝试解决问题:

     

您正在使用jQuery的.serialize()方法创建文本字符串   标准的URL编码表示法。

     

使用“contentType:false”时,您需要传递未编码的数据。

     

尝试使用“new FormData”而不是.serialize():

来源:https://stackoverflow.com/a/20863123/3345051

修订代码:

$("#form_save_file").submit(function(e) {

    e.preventDefault();

    var $this = $(this);
    var postURL = '/url/';
    var formData = new FormData(this);


    $.ajax({
           type: "POST",
           url: postURL,
           data: formData,
           mimeType: "multipart/form-data",
           contentType: false,
           cache: false,
           processData: false
    })
    .done(function(response) {
        // Do something if POST is successful
    })
    .fail(function() {
        // Do something if POST is unsuccessful
    })

})

答案 1 :(得分:0)

使用@csrf_exempt装饰器禁用特定视图上的csrf并使用随机数/字符串构建自定义安全性