2016-03-15 22 views
10

Sono nuovo nel framework Rango di Django. Qualcuno può spiegare perché ottengo tale errore, se faccio una richiesta POST a '/ api/index /'405 "Metodo POST non consentito" nel framework Django REST

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

Il mio codice è il seguente:

# 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', 
    ) 
} 

Ma se aggiungo <pk> nel mio modello , tutto funziona bene:

# 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()), 
] 

Sono completamente confuso. Perché è necessario utilizzare <pk> e c'è un modo per evitare l'uso di questo parametro nel pattern URL?

+1

Strano. Il codice che hai postato funziona per me. È questo il codice completo? – ilse2005

+0

Non esattamente, ho posizionato le parti che ritengo importanti. Qualche idea, dove posso sbagliare? – Fomalhaut

+2

Bene, ho copiato il codice dalla tua domanda e funziona. Ci deve essere qualche altro problema. Quale versione DRF stai usando? – ilse2005

risposta

1

è necessario cambiare solo:

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

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

Assicurarsi di avere "POST" in http_method_names. In alternativa, puoi scrivere in questo modo:

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)]