2015-06-30 2 views
0

У меня есть статические html-страницы, созданные с помощью bootstrap и jquery. На котором есть контактная форма, на которой я установил вызов Ajax Post в свое приложение django.Ajax Post Form в разных доменах приложений

Статические html-страницы размещены на сервере Windows, а мое приложение django размещено на геройку. На вызов ajax я получаю токен csrf через jquery, но он возвращает null.

$("#submit_button").click(function() { 
     var from_name   = $("#Name").val(); 
     var from_email   = $("#email").val(); 
     var story_subject  = $("#Message").val(); 
     var csrftoken = getCookie('csrftoken'); 
     console.log(from_name); 
     console.log(from_email); 
     console.log(story_subject); 
     console.log(csrftoken); 
     $.ajax({ 
      type: 'POST', 
      url: 'http://www.example.com/users/api-26/', 
      useDefaultXhrHeader: false, 
      crossDomain: true, // enable this 
      dataType: 'jsonp', 
      data: { 
      'from_name': from_name, 
      'from_email':from_email, 
      'story_subject':story_subject, 
      'csrfmiddlewaretoken': csrftoken 
      }, 
      beforeSend: function(xhr) { 
      xhr.setRequestHeader('X-CSRFToken', $.cookie('csrftoken')), 
      }, 
      success: function (response_data) { 
      var _result = JSON.parse(response_data); 
      if(_result.status == 'True'){ 
       $('#myModal').hide(); 
       console.log("sent"); 
      }else{ 
       console.log(response.error.message); 
      } 
      }, 
      error: function(xhr, textStatus, thrownError) { 
      console.log(xhr.status + ": " + xhr.responseText); 
      } 

     }); 
     return false; 
     }); 

function getCookie(name) { 
    var cookieValue = null; 
    if (document.cookie && document.cookie != '') { 
     var cookies = document.cookie.split(';'); 
     for (var i = 0; i < cookies.length; i++) { 
      var cookie = cookies[i].trim(); 
      // 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; 
} 

и вид Джанго

@csrf_protect 
@require_http_methods(["POST"]) 
def Contactus(request): 

Как у меня возникли проблемы с CSRF токен, есть ли другой способ сделать безопасный этот вызов.

+1

Междоменный POST не работает даже с правильным токеном CSRF из-за мер безопасности браузера. Чтобы заставить его работать, вам нужно настроить CORS (http://stackoverflow.com/a/7605119/1059782). –

ответ

0

Как уже указывалось ранее, вам необходимо включить CORS (совместное использование ресурсов кросс-начального уровня) на своей конечной точке, чтобы выполнить операции Ajax или ответить JSONP, который я бы предложил в качестве более удобного метода.

Чтобы включить CORS, вы можете использовать пакет django-cors-headers, в котором есть несколько вариантов игры с такими же белыми списками.

+0

Я установил его, но все еще ошибка. –

+0

'console.log (csrftoken);' this выводит null в моей консоли. –

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