2014-10-18 4 views
7

Sto cercando di scrivere un'API RESTful per la mia app pianificazione di eventi utilizzando Django Resto quadro, ma sto avendo qualche problema quando si utilizza punti di vista che non si aspettano il metodo GET HTTP. Ho letto il tutorial sul sito DRF. Da quello che ho capito dopo aver letto il tutorial e la base di classe di visualizzazione documentazione sul sito Django è che se c'è una vista classe basata come questo (preso dal tutorial DRF)Come eliminare un oggetto utilizzando Django Resto quadro

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) 

I diversi metodi nella vista corrispondono ai diversi metodi di richiesta HTTP. Quindi, se ho www.foo.com/bar sarebbe fare due cose diverse in base a quale metodo di richiesta viene inviato a tale indirizzo. Quindi, questo significa che non avrei dovuto specificare qualsiasi altra cosa perché la funzione che viene eseguito è determinato in base al metodo l'URL viene inviato con. È corretto?

ho questo punto di vista che ho cercato di modellare sull'esempio sul sito 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 

che associa a questi 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'), 

         ) 

che sto cercando di testare usando CURL con questo comando (come suggerito qui DELETE using CURL with encoded URL)

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

Questo vi sembrerà di fare ciò che dovrebbe:

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

Ma il record attuale non viene eliminato dal mio database

C'è qualcosa qui che mi sto dimenticando di fare per ottenere questi per ottenere questo per funzionare correttamente?

risposta

16

Stai diventando ridondante. Il metodo HTTP è già DELETE, quindi non c'è /events/delete nell'URL. Prova questo:

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

Per impostazione predefinita, il router di DRF crea URL dettagliate alla /event/<pk> e si GET, PUT, POST e DELETE loro di recuperare, aggiornare, creare ed eliminare rispettivamente.

+0

ma per quanto riguarda me mappatura/eventi/Elimina nella URLConfs? – user3282276

+0

Non consigliato (è una specie di anti-REST), ma che ci si configurare l'urlconf per aggiungere 'url (R '/ eventi/cancellare/(? P \ d +)', EventDetail.as_view())' –

+0

che è cosa ho nel mio urlconf attualmente. Non dovrebbe funzionare con l'indirizzo che ho specificato? Ma da quello che stai dicendo cambierò per essere più riposante grazie per la risposta – user3282276

2

Come menzionato da Kevin Stone, lo schema che si sta utilizzando non è consigliabile, ma se si desidera utilizzarlo, è necessario correggere l'errore di battitura negli url per la mappatura degli eventi eventi/eliminazione/.

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

dovrebbe essere:

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

Grazie per il chiarimento Sono assolutamente trascurato il $ – user3282276