Estoy tratando de procesar las solicitudes entrantes JSON / Ajax con Django / Python.
request.is_ajax()está Trueen 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 la solicitud de claves de publicación.
Cuando miro la POST en Firebug , se envían datos JSON en la solicitud.

len(request.POST)yrequest.POST.items()también ayudaría.Respuestas:
Si está publicando JSON en Django, creo que lo desea
request.body(request.raw_post_dataen Django <1.4). Esto le dará los datos JSON sin procesar enviados a través de la publicación. Desde allí puede procesarlo más.Aquí hay un ejemplo usando JavaScript, jQuery , jquery-json y Django.
JavaScript:
Django:
Django <1.4:
fuente
self.client.post('/event/save-json/', json.dumps(python_dict), HTTP_X_REQUESTED_WITH='XMLHttpRequest', content_type="application/json")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.
Mi JSON POST data fue:
En este caso, debe utilizar el método proporcionado por aurealus. Lee request.body y deserialízalo con json stdlib.
fuente
json_data = simplejson.loads(request.raw_post_data)¿estás seguro de que se ha indicado correctamente?django.utils.simplejsonSe ha eliminado en versiones recientes. Solo usa lajsonbiblioteca stdlib .Método 1
Cliente: Enviar como
JSONServidor:
Método 2
Cliente: Enviar como
x-www-form-urlencoded(Nota:
contentType&processDataha cambiado,JSON.stringifyno es necesario)Servidor:
Cambiado en 1.5+: https://docs.djangoproject.com/en/dev/releases/1.5/#non-form-data-in-http-requests
Probablemente relacionado
fuente
django.http.request.RawPostDataException: You cannot access body after reading from request's data streamEs importante recordar que Python 3 tiene una forma diferente de representar cadenas: son conjuntos 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:
Pero para Django 1.9 y Python 3.4 usaría:
¡Acabo de pasar por esta curva de aprendizaje haciendo mi primera aplicación Py3 Django!
fuente
request.raw_responseahora está en desuso. Utilice en surequest.bodylugar para procesar datos de formularios no convencionales, como cargas útiles XML, imágenes binarias, etc.Documentación de Django sobre el tema .
fuente
en django 1.6 python 3.3
cliente
servidor
fuente
La carga útil HTTP POST es solo un conjunto plano de bytes. Django (como la mayoría de los frameworks) lo decodifica en un diccionario desde parámetros codificados por URL o codificación MIME-multipart. Si solo vuelca los datos JSON en el contenido POST, Django no lo decodificará. O bien la decodificación JSON del contenido POST completo (no el diccionario); o coloque los datos JSON en un contenedor MIME-multipart.
En resumen, muestre el código JavaScript. El problema parece estar ahí.
fuente
request.raw_post_dataha quedado en desuso Utilizar en surequest.bodylugarfuente
Algo como esto. Funcionó: solicitar datos del cliente
Procesar solicitud en el servidor
fuente
fuente
Usando Angular, debe agregar un encabezado para solicitar o agregarlo a los encabezados de configuración del módulo:
{'Content-Type': 'application/x-www-form-urlencoded'}fuente
request.POST es solo un objeto similar a un diccionario, así que solo indexe con sintaxis dict.
Suponiendo que su campo de formulario es fred, podría hacer algo como esto:
Alternativamente, use un objeto de formulario para manejar los datos POST.
fuente