405"方法不允许POST"在Django REST框架中

时间:2016-03-15 12:25:26

标签: python django django-rest-framework

我是Django REST框架的新手。有人可以解释为什么我会收到这样的错误,如果我向' / api / index /'

发出POST请求
405 Method Not Allowed
{"detail":"Method \"POST\" not allowed."}

我的代码如下:

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

但如果我将<pk>添加到我的模式中,一切正常:

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

我完全糊涂了。为什么有必要使用<pk>并且有没有办法避免在URL模式中使用此参数?

5 个答案:

答案 0 :(得分:3)

你需要改变:

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

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

答案 1 :(得分:3)

确保http_method_names中有“POST”。或者,您可以这样写:

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

答案 2 :(得分:1)

你自己的评论是对的。您之前刚刚包含了索引网址。并且该主视图接收用于检索对象的 url 参数,因此您的新视图被解释为参数。 我在 urls.py 中遇到了同样的问题:

router = DefaultRouter()
router.register(r'', views.MainViewSet, basename='index')
router.register(r'other_view', views.OtherViewSet, basename='typeservice')

解决方案:

router = DefaultRouter()
router.register(r'main', views.MainViewSet, basename='index')
router.register(r'other_view', views.OtherViewSet, basename='other_view')

答案 3 :(得分:1)

最好不要在网址名称中使用空格。

所以,而不是这样:

router.register(r'', views.SomeViewSet, basename='index')

这样做:

router.register(r'some-url-name', views.SomeViewSet, basename='index')

答案 4 :(得分:0)

class ApiIndexView(APIView) 

请代替此  import from rest_framework import generics 并将其更改为

class ApiIndexView(generics.ListCreateAPIView) 

有很多通用视图。 ListCreateAPIView用于GET和POST,CreateAPIView仅用于POST方法