6

我有以下看法:

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
4

2 回答 2

11

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

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

于 2013-07-25T07:58:23.943 回答
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/

希望能帮助到你。

于 2013-07-24T21:27:37.227 回答