Django Rest Framework不会反序列化作为原始JSON传递的数据

时间:2013-07-24 19:12:26

标签: django django-rest-framework

我有以下观点:

class Authenticate(generics.CreateAPIView):
    serializer_class = AuthSerializer

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

如果数据作为表单传递,这很有效,但是,如果数据作为原始JSON传递,则序列化程序将被实例化,其所有字段都设置为None。文档确实提到应该有任何特定的处理原始JSON参数。

任何帮助都将不胜感激。

更新

我有以下方法可以使Browsable API在传递原始JSON时按预期工作,但我相信必须有更好的方法。

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

2 个答案:

答案 0 :(得分:9)

您以错误的方式访问请求数据 - request.POST仅处理从多部分数据中解析。

使用REST框架的request.data代替。这将处理表单数据或json数据,或者您配置的任何其他解析器。

答案 1 :(得分:1)

我猜这就是你使用Browsable API的方式。

我认为您不应该使用Browsable API来测试JSON请求,而是使用curl

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

希望它有所帮助。