2012-06-17 2 views
6

Ich habe ein Problem sehr ähnlich zu Django's Querydict bizarre behavior: bunches POST dictionary into a single key und Unit testing Django JSON View. Keine der Fragen/Antworten in diesen Threads zeigt jedoch auf das angegebene Problem hin. Ich versuche, den Testclient von Django zu verwenden, um eine Anfrage mit einem verschachtelten JSON-Objekt zu senden (was ich gut mit JSON-Objekten mit Nicht-JSON-Werten funktioniere).Django Test Client zerschmetterte verschachtelte JSON

Versuch # 1: Hier ist mein Anfangscode:

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

Wie Sie sehen können, hat ich ein verschachteltes JSON-Objekt in meinen Anforderungsdaten. Dies ist jedoch, was request.POST wie folgt aussieht:

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

Versuch # 2: Dann habe ich versucht, auf den Content-Type-Parameter hinzufügen wie folgt:

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') 

Und was ich jetzt für request.POST ist

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

Alles, was ich in der Lage tun möchte, ist eine verschachtelte dict für meine Anforderungsdaten angeben. Gibt es einen einfachen Weg, dies zu tun?

Antwort

13

Die folgenden Werke für mich (mit dem Namen args verwenden):

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

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

JSON.dumps ist der beste Weg, es zu tun. Dies sollte die akzeptierte Antwort sein. – boatcoder

6

Ihr Problem weist darauf hin, dass Django Ihre Anfrage als multipart/form-data und nicht als application/json interpretiert. Versuchen Sie

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

Eine andere Sache zu beobachten ist, dass Python Dictionary Keys/Werte in einfachen Anführungszeichen darstellt, wenn als Strings gerendert, die der Simplejson-Parser nicht mag. Halten Sie Ihre hartcodierte JSON-Objekte als Single-Strings in Anführungszeichen, mit in doppelte Anführungszeichen um diesen zu erhalten ...

0

Meine Lösung ist die folgende:

In dem Testverfahren:

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)}) 

In der Ansicht:

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

Dies sendet post ['data'] als Zeichenfolge. In der Ansicht muss man den JSON von dieser Zeichenkette laden.

Danke.

Verwandte Themen