2011-02-03 6 views
20

Quando faccio una richiesta DELETE HTTP a un'applicazione django. restituisce direttamente una risposta 301 (spostata in modo permanente) e mi reindirizza alla richiesta di GET dello stesso url. Suppongo che la richiesta Http PUT restituisca 301 proprio come la richiesta DELETE. C'è un modo per elaborare la richiesta DELETE con django?Http La richiesta di cancellazione di django restituisce un 301 (spostato in modo permissivo)

+8

E 'possibile che manchi la barra finale nell'URL per DELETE? –

+0

Puoi confermare se la vista rilevante è stata caricata o meno? Magari inserire un log all'interno della vista per confermare che viene caricato. Inoltre, questo potrebbe essere il tuo server web e non Django per nulla sta reindirizzando la richiesta? –

+2

Questo era il problema. Il mio client è backbone.js e sembra che backbone.js non metta la barra finale per modellare gli URL. così in urls.py, ho aggiunto un'altra configurazione di URL senza barra finale e ha funzionato. – yilmazhuseyin

risposta

36

Il reindirizzamento è causato dall'impostazione APPEND_SLASH:

APPEND_SLASH

predefinito: true

Quando impostata su true, se la richiesta URL non corrisponde a nessuno dei modelli in l'URLconf e non termina con una barra , un reindirizzamento HTTP viene inviato a lo stesso URL con una barra allegata. Si noti che il reindirizzamento potrebbe causare la perdita di tutti i dati inviati in una richiesta POST a .

Assicurarsi che server e client siano coerenti con le barre finali.

Se il progetto non ha bisogno delle barre finali (ovvero, è un'API senza barre finali) è possibile disabilitarlo. Altrimenti, assicurati che urlconf accetti i percorsi senza una barra finale.

+1

Questa opzione è stata configurata per il componente $ resource da angularJS 1.30.beta6 https://github.com/angular/angular.js/commit/3878be52f6d95fca4c386d4a5523f3c8fcb04270 – AlexandruC

+0

Grazie amico, risparmi la mia giornata! –

4

Ho riscontrato questo problema durante l'utilizzo di AngularJs e Django REST.

Django Rest stava reindirizzando il client per richiedere l'URL con una barra finale mentre '$resource di AngularJS' assicura che non ci sia un trattino finale sui suoi URL. Questo è descritto in questo issue

Sullo stesso link vedrai suggerimenti per utilizzare il servizio $http più flessibile invece di $resource. Ma ... Volevo davvero usare $resource (meno codice).

Quindi la soluzione è stata banale, dal momento che il team di Django REST hanno rappresentato per questo recently:

router = DefaultRouter(trailing_slash=False) 

http://django-rest-framework.org/api-guide/routers.html

(ho aggiunto a questo al mio blog da quando mi piacerebbe mantenere un log di pochi trucchi usando AngularJS & Django REST) ​​

Problemi correlati