我有以下观点:
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
答案 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/
希望它有所帮助。