2015-04-08 23 views
13

Tôi đang gửi yêu cầu POST có phần thân JSON đến máy chủ Django (khá chuẩn). Trên máy chủ, tôi cần giải mã bằng cách sử dụng json.loads().Nhận yêu cầu nội dung dưới dạng chuỗi ở Django

Vấn đề là làm thế nào để tôi lấy nội dung yêu cầu theo định dạng chuỗi?

tôi có hiện đoạn mã sau:

body_data = {} 
if request.META.get('CONTENT_TYPE', '').lower() == 'application/json' and len(request.body) > 0: 
    try: 
     body_data = json.loads(request.body) 
    except Exception as e: 
     return HttpResponseBadRequest(json.dumps({'error': 'Invalid request: {0}'.format(str(e))}), content_type="application/json") 

Tuy nhiên, điều này mang lại một lỗi the JSON object must be str, not 'bytes'.

Làm cách nào để truy lục nội dung của yêu cầu dưới dạng chuỗi, với mã hóa chính xác được áp dụng?

+0

Có phải 'request.read()' thực hiện công việc không? – dhke

+0

@dhke, không, nó cũng giống như vậy, điều này khiến tôi ngạc nhiên. 'request.body.decode ('utf-8')' có vẻ hoạt động, nhưng tôi không chắc đây có phải là cách tốt nhất để làm điều này không? – zelanix

Trả lời

26

Nội dung yêu cầu, request.body, là một chuỗi byte. Trong Python 3, json.loads() sẽ chỉ chấp nhận một chuỗi unicode, vì vậy bạn phải giải mã request.body trước khi chuyển nó đến json.loads().

body_unicode = request.body.decode('utf-8') 
body_data = json.loads(body_unicode) 

Trong Python 2, json.loads sẽ chấp nhận chuỗi unicode hoặc sting byte, do đó, bước giải mã là không cần thiết.

Khi giải mã chuỗi, tôi nghĩ rằng bạn đang an toàn để giả định 'utf-8' - Tôi không thể tìm thấy một nguồn dứt khoát cho điều này, nhưng xem đoạn trích dưới đây từ jQuery docs:

Note : Đặc tả XMLHttpRequest của W3C quyết định rằng bộ ký tự luôn là UTF-8; chỉ định một bộ ký tự khác sẽ không buộc trình duyệt thay đổi mã hóa.

Trong Python 3.6, json.loads() accepts bytes or bytearrays. Do đó, bạn không cần phải giải mã request.body (giả sử nó được mã hóa bằng UTF-8).

+0

Hoàn hảo, nhờ làm rõ điều này :) – zelanix

+2

'utf-8' cũng là giá trị mặc định của đối số đầu tiên của phương thức' decode() '(kiểm tra' help (bytes.decode) ') – rednaw

+2

Trong Python> = 3.6, 'json.loads' cũng có thể chấp nhận một đối số' byte' và nó giả định nó được mã hoá bằng UTF-8, UTF-16 hoặc UTF-32. https://docs.python.org/3/library/json.html#json.loads – Flimm

0

Tôi tin rằng đầu kia từ nơi bạn nhận được yêu cầu này không chuyển đổi dữ liệu sang JSON trước khi gửi yêu cầu. Hoặc bạn phải chuyển đổi dữ liệu sang JSON trước khi gửi hoặc chỉ cần thử truy cập request.body trong chế độ xem của bạn.

+1

Cảm ơn câu trả lời. Tôi nghĩ rằng đó là json hợp lệ mặc dù - nếu tôi sử dụng 'request.body.decode ('utf-8')' thì nó hoạt động. Có lý do nào để không làm điều này bạn sẽ nói không? – zelanix

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