Estoy tratando de procesar las solicitudes entrantes JSON / Ajax con Django / Python.
request.is_ajax()
está 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 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_data
en 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.simplejson
Se ha eliminado en versiones recientes. Solo usa lajson
biblioteca stdlib .Método 1
Cliente: Enviar como
JSON
Servidor:
Método 2
Cliente: Enviar como
x-www-form-urlencoded
(Nota:
contentType
&processData
ha cambiado,JSON.stringify
no 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 stream
Es 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_response
ahora está en desuso. Utilice en surequest.body
lugar 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_data
ha quedado en desuso Utilizar en surequest.body
lugarfuente
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