2013-07-24 23 views
5

Tôi có quan điểm như sau:Django Nghỉ ngơi Framework không deserialize dữ liệu thông qua như là JSON liệu

class Authenticate(generics.CreateAPIView): 
    serializer_class = AuthSerializer 

    def create(self, request): 
     serializer = AuthSerializer(request.POST) 
     # Do work here 

này hoạt động tốt nếu dữ liệu được thông qua như là một hình thức, tuy nhiên, nếu dữ liệu được thông qua như là một JSON liệu bộ nối tiếp được khởi tạo với tất cả các trường của nó được đặt thành Không. Tài liệu này đề cập rằng cần có bất kỳ điều gì cụ thể để xử lý một đối số JSON thô.

Mọi trợ giúp sẽ được đánh giá cao.

CẬP NHẬT

Tôi có công việc sau đây xung quanh để làm cho công việc API Có thể xem như mong đợi khi đi qua một JSON thô nhưng tôi tin rằng phải có một cách tốt hơn.

def parse_data(request): 
    # If this key exists, it means that a raw JSON was passed via the Browsable API 
    if '_content' in request.POST: 
     stream = StringIO(request.POST['_content']) 
     return JSONParser().parse(stream) 
    return request.POST 


class Authenticate(generics.CreateAPIView): 
    serializer_class = AuthSerializer 

    def create(self, request): 
     serializer = AuthSerializer(parse_data(request)) 
     # Do work here 
+0

lỗi của bạn là gì? Hay bạn thực sự gặp phải lỗi nào? –

+0

Bộ nối tiếp được khởi tạo bằng Nones. Vấn đề là API có thể duyệt được gửi JSON bên trong một khóa '_content'. Tôi đã tạo ra một chức năng để xác định khi nào là trường hợp này và phân tích cú pháp json thành một dict nhưng tôi tin rằng phải có một cách tốt hơn. – Raphael

Trả lời

8

Bạn đang truy cập dữ liệu yêu cầu sai cách - request.POST chỉ xử lý phân tích cú pháp dữ liệu nhiều phần của biểu mẫu.

Sử dụng khung công tác REST request.data để thay thế. Điều đó sẽ xử lý dữ liệu biểu mẫu hoặc dữ liệu json hoặc bất kỳ trình phân tích cú pháp nào khác mà bạn đã định cấu hình.

+0

Không có gì giống như một câu trả lời từ người tạo ra khung chính mình :) – Raphael

1

Tôi đoán đó là cách thức khi bạn đang sử dụng API có thể duyệt.

Tôi nghĩ bạn không nên sử dụng API Có thể xem để kiểm tra yêu cầu JSON, sử dụng curl thay vì:

curl -v -H "Content-type: application/json" -X POST -d '{"foo": 1, "bar": 1}' http://127.0.0.1:8000/api/something/ 

Hy vọng nó giúp.

+0

Các nhà phát triển khác mong muốn sử dụng API có thể duyệt để xác thực JSON của họ và vì API có thể duyệt có một tab để đăng JSON thô, tôi cho rằng có thứ gì đó để làm cho trình nối tiếp hoạt động với điều đó. Tôi đã đăng một vấn đề trên trang Github của dự án. Một kiểm tra đơn giản trên __init__ của Serializer nên làm thủ thuật và làm cho nó hoạt động ra khỏi hộp. – Raphael

+0

tốt đẹp, hãy cho tôi biết kết quả sau đó;) –

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