web-dev-qa-db-fra.com

405 "Méthode POST n'est pas autorisé "à Django REST cadre

Je suis nouveau dans le framework Django REST. Est-ce que quelqu'un peut expliquer pourquoi j'obtiens une telle erreur, si je fais une demande POST à

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

Mon code est le suivant:

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

Mais si j'ajoute <pk> dans mon modèle, tout fonctionne correctement:

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

Je suis complètement confus. Pourquoi est-il nécessaire d'utiliser <pk> et existe-t-il un moyen d'éviter l'utilisation de ce paramètre dans le modèle d'URL?

12
Fomalhaut

Vous devez changer simplement: 

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

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

Assurez-vous que vous avez "POST" in http_method_names. Alternativement, vous pouvez l'écrire comme ceci:

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)]
3
M.Void
class ApiIndexView(APIView) 

au lieu de cela s'il vous plaît import from rest_framework import generics et remplacez-le par 

class ApiIndexView(generics.ListCreateAPIView) 

Il existe de nombreuses vues génériques. ListCreateAPIView est utilisé pour GET et POST et CreateAPIView est utilisé uniquement pour les méthodes POST

0
Prasad Giri