2013-09-24 10 views
21

mam prośbę takiego:wysyłania danych post z angularjs Django jako JSON, a nie jako surowego zawartości

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

W moich poglądów django:

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

Więc kiedy zrobić request.POST otrzymuję pusty dict zapytania: <QueryDict: {}>

ale mój request.body posiada: test=data

Wierzę, że django odbiera dane jako parametry zakodowane w url, a nie jako słownik.

Jak wysłać lub odebrać te dane jako JSON/Dict?

+0

Czy kod jest prawidłowy? Myślę, że powinieneś użyć request.POST zamiast request.post. – esauro

+0

Zamiast 'data', wypróbuj' params' i podaj obiekt zamiast łańcucha. Ref: http://docs.angularjs.org/api/ng.$http#parameters –

Odpowiedz

44

Dzwoniąc ajax, ty otrzymywać zakodowany ciąg json w żądaniu ciała, więc trzeba dekodować go przy użyciu modułu json Pythona aby uzyskać Pythona dict:

json.loads(request.body) 
+5

Podoba mi się to rozwiązanie, ponieważ mogę używać AngularJS tak, jak zostało to zaprojektowane, zamiast hackowania go do pracy tak, jak przywykłem do pracy z jQuery. – Dustin

+0

Piękna metoda idiomatyczna. –

+1

Jeśli używasz kątowych 4 i DRF, użyj 'request.data'. –

0

Usługa $http oczekuje obiektu JS, a nie ciągu. Spróbuj tego:

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

właśnie tego wypróbowałem. Jest to ten sam wynik :( –

14

W moim przypadku działa coś jak

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

lub więcej miłą odmianą:

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

a następnie

$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

Używam zope2 gdzie użyłem simplejson zdekodować żądania json w słowniku Pythona jako:

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

to działa prawidłowo dla mnie. W ten sposób mogę użyć domyślnego żądania json, a nie konwertować go na post.

+0

zaoszczędził mi dzień – Ravi

2

poprawiłem rozwiązanie mariodev trochę tworząc dekorator:

# 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 

Teraz wystarczy dodać @json_body_decoder dekorator gdy tworzę obsługi żądania, która zajmuje się danymi pocztowych w application/json.

1

Dla kątowego 4 i Django Rest Framework należy użyć request.data, aby uzyskać obiekt JSON.

lubię:

posted_data = request.data

Powiązane problemy