2011-12-23 28 views
18

Ho 2 pagine html.Jquery e Django CSRF Token

Una pagina padre e una pagina figlio. La pagina secondaria contiene un pulsante Invia che esegue il codice nella pagina padre per inviare un messaggio Ajax.

Carico la pagina secondaria utilizzando il metodo $ .load() e quindi quando si fa clic sul pulsante viene eseguito un metodo $ .ajax .POST. Questo metodo di post passa solo una stringa JSON al codice Python.

Quando lo faccio su qualsiasi browser eccetto IE Funziona bene. Tuttavia quando eseguo questo codice in IE. Ottengo gli errori Python/Django sui token CSRF.

I Think il motivo è perché la pagina figlio è solo un aggiornamento della pagina corrente stessa con il codice serveride in esecuzione.

Qualcuno sa come dovrei fare per farlo funzionare.

Cheers,

risposta

29

Non stanno passando il token CSRF con POST. Prova a fare ciò che ho fatto nei dati . Questo è per recuperare il token csrf (o il tuo metodo) e passarlo nei tuoi argomenti.

$.ajax({ 
    url : url, 
    type: "POST", 
    data : {csrfmiddlewaretoken: document.getElementsByName('csrfmiddlewaretoken')[0].value}, 
    dataType : "json", 
    success: function(data){ 
     // do something 
    } 
}); 
+0

Ha funzionato come un fascino. Molte grazie :-) – TheMonkeyMan

+4

Questo approccio va bene, ma se stai facendo molte richieste di ajax, potresti trovare più conveniente passare il token CSRF come intestazione. Per ulteriori informazioni consultare [django docs] (https://docs.djangoproject.com/en/dev/ref/contrib/csrf/#ajax). – Alasdair

+7

Trovo 'data: {..., 'csrfmiddlewaretoken': '{{csrf_token}}'}, ...' più semplice. – Tuttle

5

Dal docs su CSRF e AJAX:

Il token CSRF è presente anche nel DOM, ma solo se esplicitamente incluso utilizzando csrf_token in un modello. Il cookie contiene il token canonico; CsrfViewMiddleware preferirà il cookie al token nel DOM. Indipendentemente da ciò, hai la garanzia di avere il cookie se il token è presente nel DOM, quindi dovresti usare il cookie!

Esempio(anche dalla documentazione)

// using jQuery 
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 = 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 csrftoken = getCookie('csrftoken'); 

o qualsiasi altro modo di interagire con i biscotti potrebbe essere utilizzato.

6

Se si invia un corpo di richiesta POST, è forse più semplice aggiungere il token csrf come intestazione di richiesta. Trovo questo approccio più facile da leggere, in quanto non ingombra il corpo della richiesta con un token. La maggior parte delle richieste AJAX invierà il token csrf come intestazione, come suggerito dalla documentazione di Django.

function startTest(testId) { 
    var payload = JSON.stringify({ 
    test_id : testId 
    }); 
    $.ajax({ 
    url: "/test-service/", 
    method: "POST", 
    headers: {'X-CSRFToken': '{{ csrf_token }}'}, 
    data: payload, 
    dataType: "json" 
    }).done(function(response) { 
    console.log(response.id + " " + response.name); 
    }).fail(function (error) { 
     console.log(error); 
    }); 
}