2014-09-02 45 views
1

我有一個類似的問題,因爲這個問題對串行外部驗證在Django的REST框架數據:使用ParseError Django的REST框架返回無效數據

Raise Validation Error In Pre_Save Using Django Rest Framework

我的代碼:

def pre_save(self, obj): 
    data = self.request.DATA['users'] 
    for user in data: 
     if not user in allowed_users: 
      raise ParseError('An unpermitted user has been included') 

從跟蹤看來它試圖發送響應,但它失敗:

「」需要爲fi值在這種多對多關係可以被使用之前。

UPDATE:

我感動提高ParseError成get_serializer_class()方法,像這樣:

def get_serializer_class(self): 
    if 'users' in self.request.DATA: 
     # make sure the users are allowed 
     data = self.request.DATA['users'] 
     for user in data: 
      if not user in allowed_users: 
       raise ParseError(detail='Unpermitted user') 
    return serializer 

這引發異常,但是,它並沒有使用REST框架的JSON響應返回它。相反,我得到的Django堆棧跟蹤和500錯誤,這是不好的。

謝謝!

回答

0

當在pre_save方法(),post_save()或甚至在view類的post()方法中引發異常時,它將由Django-REST-Framework正確處理。如果我使用捲曲或類似的方式,錯誤將被正確返回。

這實際上是可瀏覽API中的一個錯誤,這正是我用來測試的 - 使用「原始數據」表單發送數據。當試圖呈現html響應時,DRF顯然試圖捕獲該帖子的「上下文」。在這種情況下,它希望保存/完成的帖子。

這並不存在,所以Django呈現錯誤正在拋出,讓我困惑。

使用curl進行測試時,響應是準確的。

請注意,像我這樣將它放在get_serializer_class()中會導致它脫離DRF異常處理程序,因此Django正確顯示它並顯示錯誤被正確引發。

1

查看APIView's handle_exception - 這是DRF處理請求期間引發的異常的地方。

從文檔:

的默認實現處理的rest_framework.exceptions.APIException任何子類,以及Django的Http404PermissionDenied異常,並返回一個適當的錯誤響應。

如果您需要自定義錯誤響應您的API返回應該子類此方法。

因此,您需要重寫此操作來處理ParseError例外情況。

另請參閱Exceptions上的DRF文檔。

我希望有幫助。

+0

感謝您的提示卡爾頓。看起來這個問題更多地與Browsable API有關。 – dolphinkickme 2014-09-03 21:30:41