2014-10-18 3 views
7

Django Rest Framework를 사용하여 이벤트 계획 응용 프로그램을위한 RESTful API를 작성하려고하지만 GET HTTP 메소드를 기대하지 않는보기를 사용할 때 약간의 문제가 있습니다. DRF 사이트의 튜토리얼을 읽었습니다. 내가 튜토리얼과 장고 사이트에서 클래스를 기반으로보기 문서를 읽고 이해 대상에서 그 클래스를 기반으로합니다 (DRF 튜토리얼에서 가져온)이 같은보기Django Rest Framework를 사용하여 객체를 삭제하는 방법

class SnippetDetail(APIView): 
    """ 
    Retrieve, update or delete a snippet instance. 
    """ 
    def get_object(self, pk): 
     try: 
      return Snippet.objects.get(pk=pk) 
     except Snippet.DoesNotExist: 
      raise Http404 

    def get(self, request, pk, format=None): 
     snippet = self.get_object(pk) 
     serializer = SnippetSerializer(snippet) 
     return Response(serializer.data) 

    def put(self, request, pk, format=None): 
     snippet = self.get_object(pk) 
     serializer = SnippetSerializer(snippet, data=request.DATA) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

    def delete(self, request, pk, format=None): 
     snippet = self.get_object(pk) 
     snippet.delete() 
     return Response(status=status.HTTP_204_NO_CONTENT) 

뷰에있는 다른 방법이있는 경우 다른 HTTP 요청 메소드에 해당합니다. 그래서 만약 내가 www.foo.com/bar 있다면 그것은 요청 방법이 그 주소로 보내지는 것에 따라 두 가지 다른 일을 할 것입니다. 즉, 실행되는 함수는 URL을 보내는 방법에 따라 결정되므로 다른 것을 지정하지 않아도됩니다. 이 올바른지?

나는 내가이 명령을 CURL을 사용하여 테스트하기 위해 노력하고 이러한 URL

urlpatterns = patterns('', 

         # Get event 
         url(r'^(?P<pk>\d+)/$', views.EventDetail.as_view(), 
          name='create_events'), 
         # list all events 
         url(r'^list/$', views.EventList.as_view(), 
          name='list_events'), 
         # url(r'^update$/(?P<pk>\d+)', #update event), 
         url(r'^create/$', views.EventDetail.as_view(), 
          name='create_events'), 
         # delete event 
         url(r'^delete$/(?P<pk>\d+)', 
          views.EventDetail.as_view(), name='delete_event'), 

         ) 

에 매핑되는 DRF 사이트

class EventDetail(APIView): 

    """ 
    Retrieve, update or delete a event instance. 
    """ 

    def get_object(self, pk): 
     try: 
      return Event.objects.get(pk=pk) 
     except Event.DoesNotExist: 
      raise Http404 

    def get(self, request, pk, format=None): 
     event = self.get_object(pk) 
     serializer = EventSerializer(event) 
     return Response(serializer.data) 

    def post(self, request, format=None): 
     serializer = EventSerializer(data=request.DATA) 
     if serializer.is_valid(): 
      serializer.save() 
      return Response(serializer.data, status=status.HTTP_201_CREATED) 
     return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

    # def put(self, request, pk, format=None): 
    #  event = self.get_object(pk) 
    #  serializer = EventSerializer(event, data=request.DATA) 
    #  if serializer.is_valid(): 
    #   serializer.save() 
    #   return Response(serializer.data) 
    #  return Response(serializer.errors, status=status.HTTP_400_BAD_REQUEST) 

    def delete(self, request, pk, format=None): 
     event = self.get_object(pk) 
     event.delete() 
     return Response(status=status.HTTP_204_NO_CONTENT 

의 예 후 모델로 노력이보기가 (여기에 제안 된 것과 같습니다. DELETE using CURL with encoded URL)

curl -X DELETE "http://127.0.0.1:8000/events/delete/1" 

무엇을해야 :

[18/Oct/2014 22:41:27] "DELETE /events/delete/1 HTTP/1.1" 404 2707 

그러나 실제 기록이 내 데이터베이스

에서 삭제되지 않습니다 내가이이 제대로 작동하려면 얻을하려면 어떻게 잊고 여기에 뭔가가 있나요?

답변

16

중복 되는군. HTTP 메소드는 이미 DELETE이므로 URL에 /events/delete이 없습니다. 기본적으로

curl -X DELETE "http://127.0.0.1:8000/events/1/" 

은 DRF의 라우터가 /event/<pk>에서 자세한 URL을 생성하고 GET, PUT, POSTDELETE들을 검색하기 위해 업데이트 만들고 각각 삭제 :이보십시오.

+0

그러나 매핑/이벤트 /를 URLconf는에서 삭제 하시겠습니까? – user3282276

+0

당신은 urlconf에'REST/REST/일종의 (REST/일종의 anti-REST)이지만,'url (r)/events/delete/(? P \ d +) ', EventDetail.as_view())' –

+0

현재 내 urlconf에있는 것. 이미 지정된 주소로 작업해야하지 않습니까? 하지만 당신이 말하는 것에서 나는 그것을 더 바꿀 것으로 바꿀 것입니다. 대답은 – user3282276

2

Kevin Stone에서 언급했듯이 사용중인 패턴은 좋지 않지만 사용하려면 이벤트/삭제/ 매핑에 대한 URL의 오타를 수정해야합니다.

# delete event 
url(r'^delete$/(?P<pk>\d+)', 
    views.EventDetail.as_view(), name='delete_event'), 

가 있어야한다 : 나에 대해

# delete event 
url(r'^delete/(?P<pk>\d+)', 
    views.EventDetail.as_view(), name='delete_event'), 
+0

$를 간과 한 것을 분명히 해 주어서 고맙습니다. – user3282276

관련 문제