¿Dónde están mis datos JSON en mi solicitud entrante de Django?

2 minutos de lectura

Estoy tratando de procesar solicitudes JSON/Ajax entrantes con Django/Python.

request.is_ajax() es True en la solicitud, pero no tengo idea de dónde está la carga útil con los datos JSON.

request.POST.dir contiene esto:

['__class__', '__cmp__', '__contains__', '__copy__', '__deepcopy__', '__delattr__',
 '__delitem__', '__dict__', '__doc__', '__eq__', '__ge__', '__getattribute__',
'__getitem__', '__gt__', '__hash__', '__init__', '__iter__', '__le__', '__len__',
 '__lt__', '__module__', '__ne__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', 
'__setattr__', '__setitem__', '__str__', '__weakref__', '_assert_mutable', '_encoding', 
'_get_encoding', '_mutable', '_set_encoding', 'appendlist', 'clear', 'copy', 'encoding', 
'fromkeys', 'get', 'getlist', 'has_key', 'items', 'iteritems', 'iterkeys', 'itervalues', 
'keys', 'lists', 'pop', 'popitem', 'setdefault', 'setlist', 'setlistdefault', 'update', 
'urlencode', 'values']

Aparentemente no hay claves en las claves de publicación de solicitud.

Cuando miro el POST en bicho de fuego, se envían datos JSON en la solicitud.

  • ¿Qué estás publicando realmente? Muéstranos la llamada javascript.

    – Daniel Rosemann

    30 jul. 2009 a las 17:28

  • Y len(request.POST) y request.POST.items() también ayudaría.

    – Vinay Sajip

    30 jul. 2009 a las 17:47

¿Donde estan mis datos JSON en mi solicitud entrante de
Jared Knipp

Si está publicando JSON en Django, creo que quiere request.body (request.raw_post_data en Django < 1.4). Esto le dará los datos JSON sin procesar enviados por correo. A partir de ahí, puede procesarlo más.

Aquí hay un ejemplo usando JavaScript, jQuery, jquery-json y Django.

JavaScript:

var myEvent = {id: calEvent.id, start: calEvent.start, end: calEvent.end,
               allDay: calEvent.allDay };
$.ajax({
    url: '/event/save-json/',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: $.toJSON(myEvent),
    dataType: 'text',
    success: function(result) {
        alert(result.Result);
    }
});

Django:

def save_events_json(request):
    if request.is_ajax():
        if request.method == 'POST':
            print 'Raw Data: "%s"' % request.body   
    return HttpResponse("OK")

Django <1.4:

  def save_events_json(request):
    if request.is_ajax():
        if request.method == 'POST':
            print 'Raw Data: "%s"' % request.raw_post_data
    return HttpResponse("OK")

  • Por favor, explique lo que quiere decir con ‘cliente de prueba’. ¿Que estás tratando de hacer?

    – Jared Knipp

    25 oct.

  • No estoy tratando de ser grosero: por “cliente de prueba”, me refiero al “cliente de prueba” de django. ¿Cómo prueba las vistas si no es con el cliente de prueba?

    – jMyles

    02 nov.

  • Tenga en cuenta: debe terminar la url con un carácter de barra oblicua ( / ). También deshabilite CSRF con @csrf_exempt

    – dani herrera

    03 jun.

  • NB si está usando 1.4, esto se llamaría request.body . raw_post_data está en desuso…

    – prauchfuss

    08 oct.

  • para probar con django unittest solo hazlo self.client.post('/event/save-json/', json.dumps(python_dict), HTTP_X_REQUESTED_WITH='XMLHttpRequest', content_type="application/json")

    – Guillermo Vicente

    11 ago.

¿Donde estan mis datos JSON en mi solicitud entrante de
estricjux

Yo tuve el mismo problema. Había estado publicando una respuesta JSON compleja y no podía leer mis datos usando el diccionario request.POST.

Mis datos JSON POST fueron:

//JavaScript code:
//Requires json2.js and jQuery.
var response = {data:[{"a":1, "b":2},{"a":2, "b":2}]}
json_response = JSON.stringify(response); // proper serialization method, read 
                                          // http://ejohn.org/blog/ecmascript-5-strict-mode-json-and-more/
$.post('url',json_response);

En este caso, debe utilizar el método proporcionado por aurealus. Lea el cuerpo de la solicitud y deserialícelo con json stdlib.

#Django code:
import json
def save_data(request):
  if request.method == 'POST':
    json_data = json.loads(request.body) # request.raw_post_data w/ Django < 1.4
    try:
      data = json_data['data']
    except KeyError:
      HttpResponseServerError("Malformed data!")
    HttpResponse("Got json data")

  • Tengo problemas con la cuarta línea: json_data = simplejson.loads(request.raw_post_data) ¿estás seguro de que está bien dicho?

    – wfbarksdale

    29 nov.


  • Estoy bastante seguro de que request.raw_post_data es la forma correcta, ya que usé este ejemplo en las pruebas. ¿Qué tipo de problemas tienes @weezybizzle?

    – estrictojux

    29 nov.

  • Los datos que venían en un texto adicional también se adjuntaron, lo que estaba arruinando el análisis. Así que era 100% yo.

    – wfbarksdale

    29 nov.

  • django.utils.simplejson ha sido eliminado en versiones recientes. Solo usa la stdlib json Biblioteca.

    – Martijn Pieters

    18 jun.

  • Querrás usar request.body en lugar de request.raw_post_data para Django 1.4+

    – mooney

    10 mayo 2016 en 20:59

¿Donde estan mis datos JSON en mi solicitud entrante de
usuario

Método 1

Cliente: Enviar como JSON

$.ajax({
    url: 'example.com/ajax/',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    processData: false,
    data: JSON.stringify({'name':'John', 'age': 42}),
    ...
});

//Sent as a JSON object {'name':'John', 'age': 42}

servidor:

data = json.loads(request.body) # {'name':'John', 'age': 42}

Método 2

Cliente: Enviar como x-www-form-urlencoded

(Nota: contentType & processData han cambiado, JSON.stringify no es necesario)

$.ajax({
    url: 'example.com/ajax/',
    type: 'POST',    
    data: {'name':'John', 'age': 42},
    contentType: 'application/x-www-form-urlencoded; charset=utf-8',  //Default
    processData: true,       
});

//Sent as a query string name=John&age=42

servidor:

data = request.POST # will be <QueryDict: {u'name':u'John', u'age': 42}>

Cambiado en 1.5+: https://docs.djangoproject.com/en/dev/releases/1.5/#non-form-data-in-http-requests

Datos sin formulario en solicitudes HTTP
:
request.POST ya no incluirá datos publicados a través de solicitudes HTTP con tipos de contenido no específicos del formulario en el encabezado. En versiones anteriores, los datos publicados con tipos de contenido que no sean multipart/form-data o application/x-www-form-urlencoded todavía terminarían representados en el atributo request.POST. Los desarrolladores que deseen acceder a los datos POST sin procesar para estos casos, deben usar el atributo request.body en su lugar.

probablemente relacionado

  • Re 1 – django.http.request.RawPostDataException: You cannot access body after reading from request's data stream

    – AlxVallejo

    15 mar. 18 a las 21:28

Es importante recordar que Python 3 tiene una forma diferente de representar cadenas: son matrices de bytes.

Usando Django 1.9 y Python 2.7 y enviando los datos JSON en el cuerpo principal (no un encabezado), usaría algo como:

mydata = json.loads(request.body)

Pero para Django 1.9 y Python 3.4 usarías:

mydata = json.loads(request.body.decode("utf-8"))

¡Acabo de pasar por esta curva de aprendizaje al crear mi primera aplicación Py3 Django!

1642809787 672 ¿Donde estan mis datos JSON en mi solicitud entrante de
kevin s lin

request.raw_response ahora está en desuso. Usar request.body en su lugar, para procesar datos de formularios no convencionales, como cargas útiles XML, imágenes binarias, etc.

Documentación de Django sobre el tema..

1642809787 177 ¿Donde estan mis datos JSON en mi solicitud entrante de
pato de goma

en django 1.6 python 3.3

cliente

$.ajax({
    url: '/urll/',
    type: 'POST',
    contentType: 'application/json; charset=utf-8',
    data: JSON.stringify(json_object),
    dataType: 'json',
    success: function(result) {
        alert(result.Result);
    }
});

servidor

def urll(request):

if request.is_ajax():
    if request.method == 'POST':
        print ('Raw Data:', request.body) 

        print ('type(request.body):', type(request.body)) # this type is bytes

        print(json.loads(request.body.decode("utf-8")))

1642809788 709 ¿Donde estan mis datos JSON en mi solicitud entrante de
Pedro Mortensen

La carga útil de HTTP POST es solo un conjunto plano de bytes. Django (como la mayoría de los marcos) lo decodifica en un diccionario a partir de parámetros codificados en URL o codificación MIME de varias partes. Si solo descarga los datos JSON en el contenido POST, Django no lo decodificará. Realice la decodificación JSON del contenido POST completo (no del diccionario); o coloque los datos JSON en un envoltorio multiparte MIME.

En resumen, mostrar el código JavaScript. El problema parece estar ahí.

  • ¡Ahora veo el problema! El parámetro type=’json’ en jquery se refiere a qué tipo esperar, no a lo que envía. Está enviando datos codificados de forma regular, por lo que si quiero enviar “json”, necesito convertirlo de alguna manera en una cadena y pasar “json = {foo: bar,}”, etc. Sin embargo, no puedo creer que eso sea como la mayoría de la gente lo hace. Debo estar perdiendo algo aquí.

    usuario122299

    30 jul. 2009 a las 18:18

  • En realidad, puede convertir el formulario en una cadena JSON en jQuery con la función .serialize(). Pero, ¿por qué necesitas enviar json en particular? ¿Qué tiene de malo enviar solo los datos del formulario?

    – Daniel Rosemann

    30 jul. 2009 a las 18:45

  • Hay muchos casos en los que los datos de formulario sin procesar no son suficientes; JSON le permite enviar objetos jerárquicos, no solo clave: pares de valores. Puede enviar conjuntos anidados, matrices, etc. Probablemente podría hacer todo eso con datos de publicación, pero no es tan conveniente. Es agradable tratar siempre con JSON, tanto hacia como desde

    – taxiliano

    15 mayo 2010 a las 20:03

.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad