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?
Vous devez changer simplement:
# views.py
class ApiIndexView(UpdateView):
permission_classes = (permissions.AllowAny,)
def post(self, request, format=None):
return Response("ok")
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)]
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