Django-ajax: проверка CSRF не удалась. Запрос прерван

Я работаю с формой на стороне сервера 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>

Я использую ajax для отправки запроса.

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

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

Я включил классы промежуточного программного обеспечения в 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'
)

Когда я удалил contentType и processData в запросе ajax, request.FILES пуст в views.py, а все остальное работает нормально.


person chakku    schedule 11.01.2016    source источник


Ответы (2)


Значение параметра contentType в false используется для форм multipart/form-data, которые передают файлы.

Когда для параметра contentType установлено значение false, это заставляет jQuery не добавлять заголовок Content-Type, иначе в нем будет отсутствовать граничная строка. Кроме того, при отправке файлов через multi-part/form необходимо оставить для флага 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
    })

})
person Hybrid    schedule 11.01.2016
comment
Здорово! Если этот ответ сработал, нажмите на галочку слева, чтобы другие увидели этот ответ, если им также понадобится помощь. - person Hybrid; 11.01.2016

отключил csrf для определенного представления с помощью декоратора @csrf_exempt и создал пользовательскую безопасность со случайным числом/строкой

person Saurabh Chandra Patel    schedule 10.06.2018