2015-04-09 2 views
0

У меня очень простая форма, к которой я добавил загрузчика. Когда я призываю загрузчик, Джанго возвращает { «детали»: «CSRF Ошибка:. CSRF маркер отсутствует или неправильно»} Это загрузчик:dojox.form.Uploader 403 ошибка с сервера django

  var ul = new Uploader(
      { 
       label:"Programmed uploader", 
       multiple:false, 
       uploadOnSelect:true, 
       url:Environment.apiRoot + "upload/", 
       headers:{ 
        "Accept" : "application/json", 
        "X-CSRFToken" : dojo.cookie("csrftoken") 
       } 
      }).placeAt(form); 

Я создал простую кнопку «тест», который вызывает функцию который выполняет тот же пост.

  new Button({ 
       name:"Cancel2", 
       //id:"Cancel", 
       label:"Cancel" , 
       placement:"secondary", 
       onClick:lang.hitch(this,function(event){ 
        this._testpost() 
       }) 
      }).placeAt(form); 

Это relavent заголовок от пользователя отправлять

Cookie djdt = шкурку; csrftoken = WwlARc9OUevblKfgNEDU2Ae4eT9z0kos; SessionID = du37rjyam6v69mw0bgctkbw708xlvc5g

Это _testpost()

_testpost: function(){ 
     xhr.post({ 
      url: Environment.apiRoot + "upload/", 
      handleAs: "json", 
      postData: json.stringify(data), 
      headers: { 
       "Content-Type": "application/json", 
       "Accept" : "application/json", 
       "X-CSRFToken" : dojo.cookie("csrftoken") 
      }, 
      loadingMessage: "Submitting form..." 
     }).then( 
      lang.hitch(this,function(result) { 
       form = t._f_form; 
       dojo.destroy(form); 
       this._float.destroyRecursive(); 
       alert(result['result_text']); 

       result['message'] = "Update Request Accepted"; 

      }),lang.hitch(this, function(err){ 
       form = t._f_form; 
       dojo.destroy(form); 
       this._float.destroyRecursive(); 
       topic.publish("/application/message","An error occurred."); 
     }));  

это соответствующий заголовок от вызова функции _testpost

Печенье djdt = шкурку; csrftoken = WwlARc9OUevblKfgNEDU2Ae4eT9z0kos; SessionID = du37rjyam6v69mw0bgctkbw708xlvc5g

X-CSRFToken WwlARc9OUevblKfgNEDU2Ae4eT9z0kos

Основное различие в том, что в _testpost Х-CSRFToken помещается в заголовок, но на пост Uploader, у меня нет никаких средств положить в X-CSRFToken (атрибут мои заголовки, кажется, просто игнорировать - я пробовал, чтобы увидеть, если я мог бы получить эту работу)

есть ли способ, чтобы получить дополнительные заголовки в Uploader

ответ

0

к сожалению , dojox.form.Uploader не позволяет добавлять заголовки.

Существует несколько вариантов. Похоже, у вас есть доступ к токену csrf и можно добавить его к URL-адресу. Другим вариантом может быть предоставление токена csrf в качестве файла cookie, и его следует отправить с запросом XHR и Flash.

0

Что я сделал (и я не уверен, что это правильно), в представлении django отключена проверка csrf, а затем вытащить значение csrf из заголовка и сравнить его с значением csrf, которое хранится в запись сеанса на сервере.

0

вы можете использовать dojo.aspect для добавления заголовков в dojo.form.Uploader.

В случае, если вы используете HTML5 загрузить «плагин», который выглядит так как вы оставили по умолчанию, вы можете использовать что-то вроде:

aspect.after(ul, "createXhr", function(xhr) { 
       xhr.setRequestHeader("Accept", "application/json"); 
       xhr.setRequestHeader("X-CSRFToken", dojo.cookie("csrftoken")); 
       return xhr; 
      }); 

Добавить это только после создания Uploader. Также не забудьте потребовать dojo/aspect.

Обратите внимание, что это немного взломано и подвержено поломке, если некоторые изменения происходят в структуре dojo.form.Uploader (например, они обновляют его, чтобы использовать dojo.promise или другие исправления). Также подразумевается, что это работает только для плагина HTML5, но вы можете расширить код таким же образом, чтобы справиться с другими плагинами, проверив ul.uploadType и внесите изменения, специфичные для этого плагина.

Смежные вопросы