2016-09-07 141 views
0

我在測試客戶端進行API調用:405錯誤時自定義的PATCH方法被稱爲用於Django的REST APIView

response2 = self.client.patch('/object/update/%d/' % 
           object_id, {'object_attribute':4}) 

該對象的相關串行和視圖類:

class ObjectUpdateSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Object 
     include=('object_attribte','another_attribute',) 

class ObjectView(APIView): 
    def patch(self, request, pk, format=None): 
     obj = Object.objects.get(id=pk) 
     data = request.data.copy() 
     """do some stuff with the data here...""" 
     serializer = ObjectUpdateSerializer(instance = obj, data=data, 
              partial=True) 
     if serializer.is_valid(raise_exception=True): 
      serializer.save() 
      return Response(serializer.data,status.HTTP_200_OK) 

當我使用PUT方法時,我能夠使用它,但我希望API調用方法更符合方法的實際含義(因此PATCH將是部分替換)。但是,對上面的測試客戶端調用的響應是這樣的:

{u'detail': u'Method "PATCH" not allowed.'} 

這是405錯誤(方法不允許)。

我檢查,看看是否有使用Django 1.10的任何問題,我也有這個輸出Django的外殼:

>>> from django.views.generic import View 
>>> View.http_method_names 
[u'get', u'post', u'put', u'patch', u'delete', u'head', u'options', u'trace'] 

它看起來好像是不Django的設置的問題,但我已經設置了一些東西。這裏可能是什麼問題?

+0

我猜你發送補丁請求到錯誤的URL。我們能否看到客戶端代碼或最好是一個顯示錯誤的'curl'命令。 –

+0

當我用「put」替換「patch」時,該方法起作用,即 'def patch(...) - > def put(...)'和 'self.client.patch - > self。 client.put' –

+0

該測試很有趣,但它不能提供足夠的信息來幫助我。嘗試瀏覽[Browsable API](http://www.django-rest-framework.org/topics/browsable-api/#urls)並查看DRF在您的API視圖中啓用了哪些HTTP請求。 –

回答

0

我面臨同樣的問題。現在看來,它不允許使用不同的視圖爲相同的路線:

urlpatterns = [ 
    # ... 
    url('^sessions/?$', views.TokenDelete.as_view()), # Viewer has delete() 
    url('^sessions/?$', views.TokenEdit.as_view()), # Viewer has patch() 
] 

正確的方法是:

urlpatterns = [ 
    # ... 
    url('^sessions/?$', views.Token.as_view()), # Viewer has both patch() and delete() 
]