2012-06-17 23 views
6

Tengo un problema muy similar al Django's Querydict bizarre behavior: bunches POST dictionary into a single key y Unit testing Django JSON View. Sin embargo, ninguna de las preguntas/respuestas en estos hilos realmente apuntan al problema específico que estoy teniendo. Estoy intentando usar el cliente de prueba de Django para enviar una solicitud con un objeto JSON anidado (lo que tengo funciona bien con objetos JSON con valores que no son JSON).Django Test Client squishes JSON anidado

Intento # 1: Aquí está mi código inicial:

response = c.post('/verifyNewMobileUser/', 
     {'phoneNumber': user.get_profile().phone_number, 
     'pinNumber': user.get_profile().pin, 
     'deviceInfo': {'deviceID': '68753A44-4D6F-1226-9C60-0050E4C00067', 'deviceType': 'I'}}) 

Como se puede ver, tengo un objeto JSON anidada dentro de mis datos de la solicitud. Sin embargo, esto es lo que se ve como request.POST:

<QueryDict: {u'phoneNumber': [u'+15551234567'], u'pinNumber': [u'4171'], u'deviceInfo': [u'deviceType', u'deviceID']}> 

Intento # 2: Luego probé, añadiendo el parámetro de tipo de contenido de la siguiente manera:

response = c.post('/verifyNewMobileUser/', 
    {'phoneNumber': user.get_profile().phone_number, 
    'pinNumber': user.get_profile().pin, 
    'deviceInfo': {'deviceID': '68753A44-4D6F-1226-9C60-0050E4C00067', 'deviceType': 'I'}}, 
    'application/json') 

Y lo que me pasa ahora para request.POST es

<QueryDict: {u"{'deviceInfo': {'deviceType': 'I', 'deviceID': '68753A44-4D6F-1226-9C60-0050E4C00067'}, 'pinNumber': 5541, 'phoneNumber': u' 15551234567'}": [u'']}> 

Todo lo que quiero hacer es ser capaz de especificar un diccionario anidada para mis datos de la solicitud. ¿Hay una forma fácil de hacer esto?

Respuesta

13

Los siguientes obras para mí (utilizando argumentos con nombre):

geojson = { 
     "type": "Point", 
     "coordinates": [1, 2] 
    } 

    response = self.client.post('/validate', data=json.dumps(geojson), 
           content_type='application/json') 
+0

JSON.dumps es la mejor manera de hacerlo. Esta debería ser la respuesta aceptada. – boatcoder

6

Su problema indica que Django está interpretando su solicitud como multipart/form-data en lugar de application/json. Pruebe

c.post("URL", "{JSON_CONTENT}", content_type="application/json").

Otra cosa a tener en cuenta es que Python representa las claves/valores del diccionario utilizando comillas simples cuando se representan como cadenas, lo que no agrada al analizador simplejson. Mantenga sus objetos JSON no modificables como cadenas entre comillas simples, utilizando comillas dobles dentro de evitar esto ...

0

Mi solución es la siguiente:

En el método de ensayo:

data_dict = {'phoneNumber': user.get_profile().phone_number, 
      'pinNumber': user.get_profile().pin, 
      'deviceInfo': 
       {'deviceID': '68753A44-4D6F-1226-9C60-0050E4C00067', 
        'deviceType': 'I'}}) 

self.client.post('/url/', data={'data': json.dumps(data_dict)}) 

En la vista:

json.loads(request.POST['data']) 

Esto envía la publicación ['data'] como una cadena. En la vista uno debe cargar el json de esa cadena.

Gracias.

Cuestiones relacionadas