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

Django ajax:CSRF验证失败。请求中止,ajax,django,ajaxform,Ajax,Django,Ajaxform,我正在使用django服务器端表单在数据库中保存详细信息 <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}}

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

<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中包含了中间件类

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'
)
当我在ajax请求中删除
contentType
processData
时,
request.FILES
在views.py中是空的,其他功能正常

contentType选项为false用于包含以下内容的多部分/表单数据表单: 传递文件

当您将contentType选项设置为false时,它会强制jQuery不 添加内容类型标题,否则,将显示边界字符串 错过了。此外,当通过多部分/表格一提交文件时 必须将processData标志设置为false,否则jQuery将 尝试将FormData转换为字符串,这将失败

要尝试解决您的问题,请执行以下操作:

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

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

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

资料来源:

修订代码:

$("#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
    })

})

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

太棒了!如果此答案有效,请按下左侧的复选标记,以便其他人在需要帮助时也能看到此答案
$("#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
    })

})