tutorial example deploy con and python django angularjs http-post

python - example - Envío de datos de publicaciones de angularjs a django como JSON y no como contenido en bruto



python angular 4 (6)

Tengo una petición como esta:

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

En mis vistas django:

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

Entonces cuando <QueryDict: {}> obtengo un <QueryDict: {}> consulta vacío: <QueryDict: {}>

Pero mi request.body tiene: test=data

Así que creo que django recibe los datos como parámetros codificados en url y no como un diccionario.

¿Cómo envío o recibo estos datos como JSON / Dict?


Al llamar a ajax, recibes una cadena json codificada en el cuerpo de la solicitud, por lo que necesitas decodificarlo utilizando el módulo json de python para obtener el dict de python:

json.loads(request.body)


El servicio $http espera un objeto JS, no una cadena. Prueba esto:

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


En mi caso funciona algo como

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

O más agradable variante:

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

y entonces

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

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


Estoy usando zope2 donde usé simplejson para decodificar la solicitud json en el diccionario python como:

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

Está funcionando correctamente para mí. De esta manera, puedo usar la solicitud json por defecto de angularjs en lugar de convertirla en una publicación de formulario.


Mejoré un poco la solución de mariodev creando un decorador:

# 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

Ahora solo agrego el decorador @json_body_decoder cada vez que creo un controlador de solicitudes que se ocupa de publicar datos en application/json .


Para angular 4 y Django Rest Framework, use request.data para obtener el objeto json.

me gusta:

posted_data = request.data