2014-07-25 27 views
11

tôi cố gắng để kiểm tra một cái nhìn, tôi nhận được một yêu cầu json từ IPad, định dạng là:Django yêu cầu bài json

req = {"custom_decks": [ 
     { 
      "deck_name": "deck_test", 
      "updates_last_applied": "1406217357", 
      "created_date": 1406217380, 
      "slide_section_ids": [ 
       1 
      ], 
      "deck_id": 1 
     } 
      ], 
    "custom_decks_to_delete": [] 
} 

Tôi đã kiểm tra này trong jsonlint và nó trôi qua.

tôi đăng req qua:

response = self.client.post('/library/api/6.0/user/'+ uuid + 
'/store_custom_dec/',content_type='application/json', data=req) 

Quan điểm trở lại "creation_success": false

Vấn đề là phương pháp bài theo quan điểm không tìm thấy custom_decks then chốt.

QueryDict: {u'{"custom_decks": [{"deck_id": 1, "slide_section_ids": [1], 
"created_date":1406217380, "deck_name": "deck_test"}], 
"custom_decks_to_delete": []}': [u'']}> 

Vấn đề là phương pháp bài viết trong chế độ xem không tìm thấy khóa tùy chỉnh chính. Bởi vì nó đang chuyển đổi dict của tôi thành QueryDict với một khóa.

Tôi đánh giá cao tất cả đều hữu ích.

Cảm ơn

Trả lời

16

Bạn đang đăng JSON, không giống như dữ liệu được mã hóa biểu mẫu. Bạn cần phải nhận được giá trị của request.body và deserialize nó:

data = json.loads(request.body) 
custom_decks = data['custom_decks'] 
+0

Yêu cầu (req), nó được viết trực tiếp trong phương pháp thử, và đó là một từ điển, tôi không thể sử dụng req.body. Làm thế nào tôi tiến hành? cảm ơn – user3877330

+0

Nhận xét đó không có ý nghĩa. Bạn đăng một từ điển: nó được nhận dưới dạng JSON mà bạn phải giải mã. Nếu mã đó không hoạt động, bạn nên hiển thị lỗi bạn nhận được. –

4

Khi tôi đang gặp vấn đề với việc dữ liệu JSON từ HttpRequest trực tiếp với mã của câu trả lời khác:

data = json.loads(request.body) 
custom_decks = data['custom_decks'] 

lỗi:

the JSON object must be str, not 'bytes' 

Đây là bản cập nhật của câu trả lời khác cho phiên bản Python> 3:

json_str=((request.body).decode('utf-8')) 
json_obj=json.loads(json_str) 

Về decode ('utf-8'), như đề cập ở:

RFC 4627:

"JSON text shall be encoded in Unicode. The default encoding is UTF-8."

Tôi kèm theo các liên kết Python gọi vấn đề cụ thể này cho phiên bản> 3 .

http://bugs.python.org/issue10976

0

Kể từ HttpRequest has a read() method tải JSON từ yêu cầu thực sự là đơn giản như:

def post(self, request, *args, **kwargs): 
    import json 
    data = json.load(request) 
    return JsonResponse(data=data) 

Nếu bạn đặt này lên như là một cái nhìn, bạn có thể kiểm tra nó và nó sẽ vang bất kỳ JSON bạn gửi lại cho bạn.

0

python 3.6django 2.0:

post_json = json.loads(request.body) 
custom_decks = post_json.get("custom_decks") 

json.loads(s, *, encoding=None,...)

Changed in version 3.6 : s can now be of type bytes or bytearray . The input encoding should be UTF-8 , UTF-16 or UTF-32 .

Từ python 3.6NO cầnrequest.body.decode('utf-8').

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