2016-02-19 39 views
2

我有Django的REST框架響應消息兩個問題Django的REST框架定製響應消息

當使用generics.ListCreateAPIViewRetrieveDestroyAPIView,通常會返回一個資源

例如,呼叫/地圖/ POST方法 結果將會像一個對象:

{ 
    "x_axis": "23", 
    "y_axis": "25", 
    "map_id": 1, 
} 

我想知道我可以編輯此消息以定製像下面一樣嗎?

{"Success":"msg blablabla"}

2.

當我使用serializers.ValidationError, 我可以,如果我使用raise serializers.ValidationError("map_id does not exist") 寫我的自定義消息 響應消息將

{"map_id":["map_id does not exist"]} 

我可以編輯這部分自定義如下?

{"FAIL":"map_id does not exist"} 

我想知道這是因爲前端不希望這種格式, 他們喜歡:

{"Success":"msg blablabla"} 
{"Fail":"msg blablabla"} 
{"USERNAME_DUPLICATE":1001} 
{"FIELD_REQUIRED":1002} 

,使他們能夠更方便地告訴用戶操作錯誤原因是什麼?

回答

4

1覆蓋在視圖中創建方法,並把這樣的事情:

def create(self, request, *args, **kwargs): 
     serializer = self.get_serializer(data=request.data) 
     serializer.is_valid(raise_exception=True) 
     self.perform_create(serializer) 
     headers = self.get_success_headers(serializer.data) 
     return Response({"Success": "msb blablabla"}, status=status.HTTP_201_CREATED, headers=headers) 

2在上面的代碼,改變raise_exceptionFalse並返回任何你想要的,如果序列化是無效的。即:

def create(self, request, *args, **kwargs): 
     serializer = self.get_serializer(data=request.data) 
     if not serializer.is_valid(raise_exception=False): 
      return Response({"Fail": "blablal", status=status.HTTP_400_BAD_REQUEST) 

     self.perform_create(serializer) 
     headers = self.get_success_headers(serializer.data) 
     return Response({"Success": "msb blablabla"}, status=status.HTTP_201_CREATED, headers=headers) 

您正在使用CBV這樣你就可以創建擴展DRF的類自定義泛型類和幹

不過,我會說,你不應該加上「成功「或」失敗「......如果http代碼是2xx,那麼用戶將知道它是可以的,當請求出現問題時爲4xx,當代碼(或服務器)出現錯誤時爲5xx,不需要在您的響應正文上重複該信息,只需使用HTTP狀態代碼

希望這有助於

+0

非常感謝!有用。我仍然有一個問題。它總是返回''''「失敗」:「blablal」''',我該如何分離消息:它是''''map_id不存在'''''''''此域是必需的''' ''或者''''這個字段已經存在''''作爲迴應 – user2492364

+0

另一個問題是我沒有在網絡上體驗過。檢查狀態碼2XX,4XX是一個正常的方法,對不對?前端似乎不想檢查狀態碼,他們只想檢查響應信息。 – user2492364

+0

你可以使用'serializer.errors'來定製錯誤。是的,前端應該檢查狀態碼 – pleasedontbelong