2013-09-24 15 views
21

ho una richiesta come questa:Invio di dati di post da angularjs Django come JSON e non come contenuto grezzo

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

Nel mio punto di vista Django:

class SomeClass(View): 
    def get(self, request): 
     return HttpResponse("Hello") 
    def post(self, request): 
     print request.post 
     print request.body 
     return HttpResponse("Done") 

Così, quando faccio request.POST ottengo una query dict vuoto: <QueryDict: {}>

Ma la mia request.body ha: test=data

Quindi credo che django riceva i dati come parametri con codifica url e non come dizionario.

Come si inviano o ricevono questi dati come JSON/Dict?

+0

è il codice corretto? Penso che dovresti usare request.POST invece di request.post. – esauro

+0

Invece di 'data', prova' params' e dai un oggetto al posto della stringa. Rif: http://docs.angularjs.org/api/ng.$http#parameters –

risposta

44

Quando si chiama Ajax, si riceve stringa JSON codificata nel corpo della richiesta, quindi è necessario per decodificarlo utilizzando il modulo JSON di pitone per ottenere python dict:

json.loads(request.body) 
+5

Mi piace questa soluzione perché posso usare AngularJS come è stato progettato invece di hackerarlo per funzionare come sono abituato a lavorare con jQuery. – Dustin

+0

Bello metodo idiomatico. –

+1

Se si utilizza angolare 4 e DRF, utilizzare 'request.data'. –

0

Il servizio $http prevede un oggetto JS, non una stringa. Prova questo:

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

appena provato. E 'lo stesso risultato :( –

14

Nel mio caso funziona qualcosa come

$http({ 
    url: '/url/', 
    method: "POST", 
    data: $.param(params), 
    headers: { 
     'Content-Type': 'application/x-www-form-urlencoded; charset=UTF-8' 
    } 
}) 

O più bella variante:

app.config ($httpProvider) -> 
    ... 
    $httpProvider.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded' 

e poi

$scope.save_result = $http.post('/url/', $.param(params)) 

http://www.daveoncode.com/2013/10/17/how-to-make-angularjs-and-django-play-nice-together/

2

Sto usando zope2 dove ho usato simplejson per decodificare la richiesta JSON in dizionario Python come:

request_dict = simplejson.loads(request.get('BODY','') 

Sta funzionando correttamente per me. In questo modo sono in grado di utilizzare la richiesta json predefinita di angularjs piuttosto che convertirla in modulo post.

+0

mi ha salvato la giornata – Ravi

2

ho migliorato la soluzione di mariodev un po 'con la creazione di un decoratore:

# Must decode body of angular's JSON post requests 
def json_body_decoder(my_func): 
    def inner_func(request, *args, **kwargs): 
     body = request.body.decode("utf-8") 
     request.POST = json.loads(body) 
     return my_func(request, *args, **kwargs) 
    return inner_func 

@json_body_decoder 
def request_handler(request): 
    # request.POST is a dictionary containing the decoded body of the request 

Ora ho solo aggiungere il @json_body_decoder decoratore ogni volta che creo un gestore di richieste che si occupa di dati di post in application/json.

1

Per angular 4 e Django Rest Framework utilizzare request.data per ottenere oggetti json.

piace:

posted_data = request.data

Problemi correlati