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