2016-03-15 12 views
10

Jestem nowością w ramach Django REST. Czy ktoś może wyjaśnić, dlaczego mam taki błąd, jeśli zrobię żądania POST do „/ api/index /”405 "Metoda POST nie jest dozwolona" w Django REST framework

405 Method Not Allowed 
{"detail":"Method \"POST\" not allowed."} 

Mój kod jest następujący:

# views.py 
class ApiIndexView(APIView): 
    permission_classes = (permissions.AllowAny,) 

    def post(self, request, format=None): 
     return Response("ok") 

# urls.py 
urlpatterns = [ 
    url(r'^api/index/$', views.ApiIndexView.as_view()), 
] 

# settings.py 
REST_FRAMEWORK = { 
    'DEFAULT_PERMISSION_CLASSES': (
     'rest_framework.permissions.DjangoModelPermissions', 
    ), 
    'DEFAULT_AUTHENTICATION_CLASSES': (
     'rest_framework.authentication.SessionAuthentication', 
     'rest_framework.authentication.TokenAuthentication', 
    ) 
} 

Ale jeśli dodać <pk> do mojego wzoru wszystko działa poprawnie:

# views.py 
class ApiIndexView(APIView): 
    permission_classes = (permissions.AllowAny,) 

    def post(self, request, pk, format=None): 
     return Response("ok") 

# urls.py 
urlpatterns = [ 
    url(r'^api/index/(?P<pk>\d+)/$', views.ApiIndexView.as_view()), 
] 

Jestem całkowicie zdezorientowany. Dlaczego konieczne jest korzystanie z <pk> i czy istnieje sposób na uniknięcie użycia tego parametru we wzorcu adresu URL?

+1

Dziwne. Wysłany przeze mnie kod działa dla mnie. Czy to pełny kod? – ilse2005

+0

Niezupełnie, umieściłem części, które uważam za ważne. Jakiś pomysł, w którym mogę się mylić? – Fomalhaut

+2

Cóż, skopiowałem kod z twojego pytania i działa. Musi być jakiś inny problem. Jakiej wersji DRF używasz? – ilse2005

Odpowiedz

1

Musisz zmienić tylko:

# views.py 
class ApiIndexView(UpdateView): 
    permission_classes = (permissions.AllowAny,) 

    def post(self, request, format=None): 
     return Response("ok") 
2

Upewnij się, że masz "post" w http_method_names. Możesz też napisać tak:

def allowed_methods(self): 
    """ 
    Return the list of allowed HTTP methods, uppercased. 
    """ 
    self.http_method_names.append("post") 
    return [method.upper() for method in self.http_method_names 
      if hasattr(self, method)] 
Powiązane problemy