2012-05-09 15 views
5

Sto inviando una richiesta POST AJAX utilizzando Angularjs e il suo modulo $ http al server Django. Ecco un esempio:invio di dati da angularjs a django

$http({ 
     method: 'POST', 
     url: '/url/', 
     data: 'test data' 
    }). 
    success(function(data, status, headers, config) { 
     doSomeStuffWhenSuccess(); 
    }); 

Il problema è ciò che ottengo in Django. Qualunque cosa io invii i dati è sempre la chiave dell'oggetto QueryDict e il valore di questo è sempre una lista vuota.

<QueryDict: {u'test data': [u'']}> 

Non ho idea del perché. Cosa mi manca?

Io uso quasi l'applicazione Django creata in modo predefinito con solo il middleware predefinito. Ho creato solo una vista e impostato un url in url config. La versione di Django è 1.3. E ho configurato il modulo $ http di angular per inviare sempre un'intestazione che contiene un token csrf per soddisfare Django.

risposta

6

Credo che Django pensi che tu stia inviando un modulo urlencoded, es. chiave = valore & chiave2 = valore2 ...

se avrebbe cercato:

$http({ 
    method: 'POST', 
    url: '/url/', 
    data: 'test=data' 
}) 

si dovrebbe ottenere

<QueryDict: {u'test': [u'data']}> 

si può sempre ottenere i dati (contenuto del corpo grezzo) come segue :

request.body 

Spero che questo è quello che stai cercando.

+0

Grazie funziona! Ma potresti spiegare perché Django pensa ai suoi dati urlocati? E se è possibile personalizzarlo? – davekr

+1

request.GET e request.POST contengono dati chiave/valore preelaborati: se vuoi dati grezzi (come JSON o testo normale) prova: request.raw_post_data –

7

Ho risolto questo problema con la funzione jQuery param. Penso che sia una soluzione più elegante.

$http({ 
    method: 'POST', 
    url: '/url/', 
    data: $.param({test: data}) 
}) 

Ora funziona come volevo.