Django REST Framework在访问request.DATA时出错
当客户端提交带有无效JSON的请求时,如何构造基于函数的视图以返回HTTP 400 REST框架声明,当访问包含无效JSON的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
request.DATA
时,可能会引发ParseError
。文档接着指出,如果视图函数已使用@api\u view
进行修饰,则会捕获错误,并向客户端返回HTTP 400错误请求
在我创建的视图中,当我访问request.DATA
时,我收到一个HTTP 500ParseError
而不是预期的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框架中是否存在可能影响此操作的内容