2012-06-17 1 views
6

У меня проблема очень похожа на Django's Querydict bizarre behavior: bunches POST dictionary into a single key и Unit testing Django JSON View. Однако ни один из вопросов/ответов в этих потоках действительно не указывает на задание, которое у меня есть. Я пытаюсь использовать тестовый клиент Django для отправки запроса с вложенным объектом JSON (то, что я хорошо работаю с объектами JSON с значениями, отличными от JSON).Django Test Client склеивает вложенные JSON

Попытка # 1: Вот мой исходный код:

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

Как вы можете видеть, у меня есть вложенный объект JSON в моих данных запроса. Тем не менее, это то, что выглядит как request.POST:

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

Попытка # 2: Затем я попробовал, добавив на параметр типа содержимого следующим образом:

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

И что я получаю в настоящее время для запроса.POST is

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

Все, что я хочу сделать, это указать вложенный идентификатор для моих данных запроса. Есть простой способ сделать это?

ответ

13

следующие работы для меня (с использованием именованных арг):

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

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

JSON.dumps - лучший способ сделать это. Это должен быть принятый ответ. – boatcoder

6

Ваша проблема заключается в том, что Django интерпретирует ваш запрос как multipart/form-data, а не application/json. Попробуйте

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

Еще одна вещь, которая стоит посмотреть, это то, что Python представляет словарные ключи/значения, используя одинарные кавычки при визуализации в виде строк, которые не нравится парсисту simplejson. Держите жестко закодированные объекты JSON в одиночные кавычки, используя двойные кавычки внутри, чтобы обойти это ...

0

Мое решение является следующее:

В методе испытания:

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

В представлении:

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

Это отправляет сообщение ['data'] в виде строки. В представлении нужно загрузить json из этой строки.

Спасибо.