Django REST Framework在访问request.DATA时出错

Django REST Framework在访问request.DATA时出错,django,django-rest-framework,Django,Django Rest Framework,当客户端提交带有无效JSON的请求时,如何构造基于函数的视图以返回HTTP 400 REST框架声明,当访问包含无效JSON的request.DATA时,可能会引发ParseError。文档接着指出,如果视图函数已使用@api\u view进行修饰,则会捕获错误,并向客户端返回HTTP 400错误请求 在我创建的视图中,当我访问request.DATA时,我收到一个HTTP 500ParseError而不是预期的HTTP 400 我的观点是这样的: from rest_framework imp

当客户端提交带有无效JSON的请求时,如何构造基于函数的视图以返回HTTP 400

REST框架声明,当访问包含无效JSON的
request.DATA
时,可能会引发
ParseError
。文档接着指出,如果视图函数已使用
@api\u view
进行修饰,则会捕获错误,并向客户端返回HTTP 400错误请求

在我创建的视图中,当我访问
request.DATA
时,我收到一个HTTP 500
ParseError
而不是预期的HTTP 400

我的观点是这样的:

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response

from serializers import PersonSerializer

@api_view(['POST'])
def person_list(request):

    # Deserialize the incoming JSON into a Person object.
    # FIXME: ParseError raised here if JSON is invalid!
    person = PersonSerializer(data=request.DATA)

    # Ensure that the request contains valid data.
    if not person.is_valid():
        return Response(person.errors, status=status.HTTP_400_BAD_REQUEST)

    # Save the Person object into the Mongo backend.
    person.save()

    return Response(person.data, status=status.HTTP_201_CREATED)
  from rest_framework import serializers

  class PersonSerializer(serializers.Serializer):
      name = serializers.CharField()
      surname = serializers.CharField()
      age = serializers.IntegerField()

      def restore_object(self, attrs, instance):
          """Given a dictionary of deserialized field values or create a new
          model instance.
          """
          return Event(**attrs)
我的序列化程序的结构如下:

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response

from serializers import PersonSerializer

@api_view(['POST'])
def person_list(request):

    # Deserialize the incoming JSON into a Person object.
    # FIXME: ParseError raised here if JSON is invalid!
    person = PersonSerializer(data=request.DATA)

    # Ensure that the request contains valid data.
    if not person.is_valid():
        return Response(person.errors, status=status.HTTP_400_BAD_REQUEST)

    # Save the Person object into the Mongo backend.
    person.save()

    return Response(person.data, status=status.HTTP_201_CREATED)
  from rest_framework import serializers

  class PersonSerializer(serializers.Serializer):
      name = serializers.CharField()
      surname = serializers.CharField()
      age = serializers.IntegerField()

      def restore_object(self, attrs, instance):
          """Given a dictionary of deserialized field values or create a new
          model instance.
          """
          return Event(**attrs)
注意,我没有使用ModelSerializer,因为模型不是由Django ORM提供的

如果我向视图发送一个无效的JSON字符串(例如,没有任何内容的发布)或使用此字符串:
{“name”:“Alice”,“姓氏”“Test”,“age”:30}
(注意
“姓氏”
之后缺少的冒号
),Django将返回一个带有以下内容的HTTP 500:

ParseError at /people/
No exception message supplied
即使我尝试访问
request.DATA
而不将其传递给
PersonSerializer
也会引发
ParseError


任何帮助都将不胜感激。

我无法复制此内容

我运行了以下代码:

from rest_framework import status
from rest_framework.decorators import api_view
from rest_framework.response import Response

@api_view(['POST'])
def person_list(request):

    data = request.DATA
    print data

    return Response({}, status=200)

from rest_framework.test import APITestCase
from django.test.utils import override_settings

class TestFoo(APITestCase):
    from django.conf.urls import patterns, url
    urls = patterns('',
        url(r'^test$', person_list),
    )

    @override_settings(APPEND_SLASH=False)
    def test_thing(self):
        bad_json = '{"name": "Alice", "surname" "Test", "age": 30}'
        resp = self.client.post('/test', bad_json, content_type='application/json')
        print resp.status_code
        print resp
得到了这个输出:

400
Vary: Accept, Cookie
Content-Type: application/json
Allow: POST, OPTIONS

{"detail": "JSON parse error - Expecting ':' delimiter: line 1 column 29 (char 28)"}
您使用的是哪个版本的rest_框架?你能提供一些包含失败测试的代码吗?您的settings.REST\u框架中是否存在可能影响此操作的内容