2013-06-17 5 views
12

Używam tuorialu SimpleRouter w dokumentach.Django REST Framework - 405 METODA NIEDOZWOLONA za pomocą SimpleRouter

Wystarczy przetestować stworzyłem tymczasową klasę Uwierzytelnianie:

class BackboneBasicAuthentication(authentication.BaseAuthentication): 
    def authenticate(self, request): 
     user = User.objects.filter(username="james") 
     return (user, None) 

ustawienia wyglądać następująco

REST_FRAMEWORK = { 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'core.rest_authentication.BackboneBasicAuthentication', 
    ), 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.AllowAny', 
    ), 
} 

Składając wniosek PUT zwraca 405 Niedozwolona metoda

{"detail": "Method 'PUT' not allowed."} 

Próbowałem również z X-HTTP-Method-Override. Nie idź.

Jakieś pomysły, co robię źle?

Spędziłem cały dzień próbując to zrozumieć, mam nadzieję, że ktoś może pomóc! :)

+0

Jeżeli nie, że 'User.objects.filter (nazwa użytkownika = ...)' 'być User.objects.get (nazwa użytkownika = ...)' zamiast? –

+0

Jakie są adresy URL, które próbujesz? –

Odpowiedz

6

Dla mnie, który wydaje się być spowodowany przez przekierowany zestaw nie implementujący lub nie dopuszczający żądań PUT. Jeśli był to problem z uwierzytelnianiem, otrzymasz kod statusu 401 UNAUTHORIZED.

18

Prosty router dodaje atrybut widoku do widoku dla adresu URL pasującego do wzorca dostarczanego z elementem dodanym jako dodatkowy element wzoru.

Na przykład jeśli użyto:

simple_router.register('widgets/', WidgetViewSet) 

Ramy utworzy dwa wzory URL:

'^widgets/$' 
'^widgets/<?P<pk>[^/]+/$' 

Jestem zgadywania, że ​​próbujesz tylko adresy URL, które spełniają pierwszy mecz, dla którego viewset instancja będzie zawierać tylko obsługę "get" ("list") i "post" ("create") dodaną przez framework, co spowoduje błąd, który widzisz, jeśli spróbujesz wstawić/skasować lub usunąć. Aby te metody działały, musisz dostarczyć pk, aby ramka wiedziała, który widget modyfikujesz lub usuwasz i aby twój adres URL pasował do widoku obsługującego te metody.

To jest mylące i możesz w ogóle nie używać prostego routera, jeśli uznasz to za zbyt mylące. Następnie możesz określić własne mapowanie metod, aby reszta_przechwytywania była wysyłana do twoich metod umieszczania, np.

url('^widgets/<?P<pk>[^/]+/$', WidgetViewSet.as_view({'put': 'update', 
                 'get': 'retrieve', 
                 'patch': 'partial_update', 
                 'delete': 'destroy'}...) 
+1

Używałem routera DRF i znalazłem widok 'user-list' nie obsługuje PUT, raczej' user-detail' obsługuje operację PUT. http://www.django-rest-framework.org/api-guide/routers/ –

+0

to powinna być poprawna odpowiedź, walczyłem przez wiele godzin, aby znaleźć tę odpowiedź. – TonyTony

+0

Dziękujemy! Jeśli masz szczegółową trasę "post", która naprawdę nie potrzebuje , po prostu przeprowadź manekina. Mam trasę metody post, która modyfikuje tablicę elementów pk przekazywanych w danych postu, więc używam: '/ api/items/0/consume_items', a 0 jest po prostu ignorowane. –