2015-09-22 10 views
0

Я пытаюсь отправить $ ajax, и у меня его есть, но я должен отправить файл с моей формой, в том же или нет, не имеет значения. Значок csrf не найден, и я получаю ошибку.403 (FORBIDDEN)

Мой Javascript

$(document).ready(function() { 
     var csrf_token = $('input[name="_token"]').val(); 

     $.ajaxSetup({ 
      headers: { 
       'X-CSRF-Token': $('meta[name="csrf-token"]').attr('content') 
      } 
     }); 

     // $("body").bind("ajaxSend", function(elm, xhr, s) { 
     //  if (s.type == "POST") { 
     //   xhr.setRequestHeader('X-CSRF-Token', csrf_token); 
     //  } 
     // }); 

     window.getCookie = function(cname) { //window for testing in console 
      var name = cname + "="; 
      var ca = document.cookie.split(';'); 
      for (var i = 0; i < ca.length; i++) { 
       var c = ca[i]; 
       while (c.charAt(0) == ' ') c = c.substring(1); 
       if (c.indexOf(name) == 0) return c.substring(name.length, c.length); 
      } 
      return ""; 
     }; 

     function sendPost() { 
      var data = $('form').serialize(); 
      var file = $(document.getElementById('files').files[0]); 

      $.ajax({ 
       type: 'POST', 
       url: '/delling_data_objects/document/', 
       //data: $('form').serialize(), it's working 
       data: file, // its don't 
       enctype: 'multipart/form-data', 
       headers: window.getCookie('csrftoken') 
      }); 
     }; 

     $('#submit').on('click', function() { 
      sendPost(); 
     }); 
    }); 

мой view.py

def load_files(request): 
    form = ApartForm(request.POST) 
    import pdb 
    pdb.set_trace() 
    if form.is_valid(): 
     form.save() 
     file_form = request.POST['file'] 
     for f in file_form: 
      with open(f) as dest: 
       for chunk in f.chunks(): 
        dest.write(chunk) 
    else: 
     return HttpResponse('form is not valid') 
    return HttpResponse('ok') 

ответ

1

Вы не делаете это правильно. Он чувствует, как вы отправляете RequestHeader дважды. (Редактирование: фигу не видел часть кода была комментировал) на основе кода, попробовать что-то вроде этого:

function sendPost() { 
     var data = $('form').serialize(); 
     var file = $(document.getElementById('files').files[0]); 
     var csrftoken = getCookie("csrftoken"); 
     $.ajax({ 
      method: "POST", 
      url: '/delling_data_objects/document/', 
      data: data, 
      beforeSend: function(xhr, settings) { 
       if (!csrfSafeMethod(settings.type) && !this.crossDomain) { 
        xhr.setRequestHeader("X-CSRFToken", csrftoken); 
       } 
      }, 
      success: function(data) { 
       // whatever you want to do 
      } 
     }); 
    } 


$('#submit').on('click', function() { 
    sendPost(); 
}); 


var getCookie = function(name) { 
    var cookieValue = null; 
    if (document.cookie && document.cookie !== "") { 
     var cookies = document.cookie.split(";"); 
     for (var i = 0; i < cookies.length; i++) { 
      var cookie = jQuery.trim(cookies[i]); 
      // Does this cookie string begin with the name we want? 
      if (cookie.substring(0, name.length + 1) == (name + "=")) { 
       cookieValue = decodeURIComponent(cookie.substring(name.length + 1)); 
       break; 
      } 
     } 
    } 
    return cookieValue; 
}; 

var csrfSafeMethod = function (method) { 
    // these HTTP methods do not require CSRF protection 
    return (/^(GET|HEAD|OPTIONS|TRACE)$/.test(method)); 
}; 
+0

ТНХ, НАСТОЯЩЕМУ поздравительные, но я думаю, что мой взгляд не работает. – Denny