2013-07-24 1 views
5

나는 다음과 같은 견해를 가지고 :장고 나머지 프레임 워크는 원시 JSON로 전달 된 데이터를 역 직렬화하지 않습니다

class Authenticate(generics.CreateAPIView): 
    serializer_class = AuthSerializer 

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

데이터가 원시 JSON으로 전달되는 경우 데이터가 그러나 형태로 전달되는 경우이 잘 작동 serializer는 None으로 설정된 모든 필드로 인스턴스화됩니다. 문서에는 원시 JSON 인수를 처리하는 데 특별한 것이 있어야한다는 언급이 있습니다.

도움을 주시면 감사하겠습니다.

UPDATE

원시 JSON을 통과 할 때 예상하지만 더 나은 방법이있을 생각으로 내가 검색 가능한 API를 작동하게하기 위해 주변의 다음과 같은 일이.

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

무엇이 오류입니까? 아니면 실제로 오류가 발생 했습니까? –

+0

시리얼 화는 Nones로 초기화됩니다. 문제는 Browsable API가 '_content'키 안에 JSON을 보내는 것입니다. 나는이 사건이 언제인지를 확인하고 dson에 json을 파싱하는 기능을 만들었지 만 더 나은 방법이 있어야한다고 믿는다. – Raphael

답변

8

요청 데이터에 잘못된 방식으로 액세스하고 있습니다. request.POST은 양식 다중 데이터의 구문 분석 만 처리합니다.

대신 REST 프레임 워크의 request.data을 사용하십시오. 그러면 폼 데이터 나 json 데이터 또는 사용자가 구성한 다른 파서를 처리합니다.

+0

프레임 워크 자신의 창조자로부터 대답 같은 게 아무것도 :) – Raphael

1

그런 다음 브라우저 가능한 API를 사용하는 방법입니다.

내가 대신 curl을, JSON 요청을 테스트 사용하는 검색 가능한 API를 사용하지한다고 생각 :

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

는 도움이되기를 바랍니다.

+0

다른 개발자들은 JSON의 유효성을 검사하기 위해 Browsable API를 사용할 것으로 기대하고 있으며, Browsable API에는 raw JSON을 게시하는 탭이 있으므로 serializer가 작동하도록 만드는 것이 있다고 가정합니다. 프로젝트의 Github 페이지에 문제점을 게시했습니다. Serializer의 __init__에 대한 간단한 점검은 트릭을 수행하고 상자에서 벗어나지 않도록해야합니다. – Raphael

+0

멋진, 그 결과를 알려주세요;) –