2014-01-12 94 views
1

當客戶端提交帶有無效JSON的請求時,應該如何構造基於函數的視圖以返回HTTP 400?訪問請求時Django REST框架ParseError.DATA

REST框架Request documentation指出在訪問包含無效JSON的request.DATA時可能會引發ParseError。文檔繼續指出,如果使用@api_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) 

我的串行器的結構是這樣的:隨着模型由提供我沒有使用ModelSerializer

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) 

注不是Django ORM。

如果我發送一個無效的JSON字符串的視圖(例如,張貼沒有任何內容)或使用該字符串:{"name": "Alice", "surname" "Test", "age": 30}(注意失蹤冒號:"surname"後)Django會返回一個HTTP 500:

ParseError at /people/ 
No exception message supplied 

即使我嘗試並訪問request.DATA而不將它傳遞給PersonSerializer 會引發。

任何幫助,將不勝感激。

回答

0

我無法複製此內容。

我跑這個代碼:

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_framework的版本您使用的?你能否提供一些包含失敗測試的代碼?你的settings.REST_FRAMEWORK中有沒有可能影響到這個的東西?

相關問題