2012-06-17 37 views
6

Tôi gặp sự cố rất giống với Django's Querydict bizarre behavior: bunches POST dictionary into a single keyUnit testing Django JSON View. Tuy nhiên, không có câu hỏi/câu trả lời nào trong các chủ đề này thực sự chỉ ra vấn đề cụ thể mà tôi đang gặp phải. Tôi đang cố gắng sử dụng khách hàng thử nghiệm của Django để gửi một yêu cầu với một đối tượng JSON lồng nhau (những gì tôi đã làm việc tốt với các đối tượng JSON với các giá trị không phải là JSON).Khách hàng thử nghiệm Django squishes lồng nhau JSON

Cố gắng # 1: Đây là mã ban đầu của tôi:

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

Như bạn thấy, tôi có một đối tượng JSON lồng bên trong dữ liệu yêu cầu của tôi. Tuy nhiên, đây là những gì request.POST trông giống như:

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

Cố gắng # 2: Sau đó, tôi cố gắng, thêm vào các tham số content-type như sau:

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

Và những gì tôi có được bây giờ cho request.POST là

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

Tất cả những gì tôi muốn làm là có thể chỉ định một mệnh đề lồng nhau cho dữ liệu yêu cầu của tôi. Có cách nào làm dễ hơn không?

Trả lời

13

Các công trình sau đây đối với tôi (sử dụng tên args):

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

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

JSON.dumps là cách tốt nhất để làm điều đó. Đây sẽ là câu trả lời được chấp nhận. – boatcoder

6

Sự cố của bạn cho biết Django đang diễn giải yêu cầu của bạn là multipart/form-data thay vì application/json. Hãy thử

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

Một điều cần lưu ý là Python đại diện cho các khóa/giá trị từ điển bằng cách sử dụng dấu nháy đơn khi được hiển thị dưới dạng chuỗi, mà trình phân tích cú pháp simplejson không thích. Giữ đối tượng JSON mã hóa cứng của bạn như là chuỗi đơn trích dẫn, sử dụng dấu ngoặc kép bên trong để làm được việc này ...

0

Giải pháp của tôi là sau:

Trong phương pháp thử nghiệm:

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

Trong giao diện:

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

Thao tác này sẽ gửi bài đăng ['dữ liệu'] dưới dạng chuỗi. Trong khung nhìn người ta phải tải json từ chuỗi đó.

Cảm ơn.

Các vấn đề liên quan