繁体   English   中英

Django REST框架中的405“不允许方法POST”

[英]405 “Method POST is not allowed” in 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 模式中使用这个参数?

确保您在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)]

你只需要改变:

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

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

而不是这个,请import from rest_framework import generics并将其更改为

class ApiIndexView(generics.ListCreateAPIView) 

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

你自己的评论是对的。 您之前刚刚包含了索引网址 并且该主视图接收用于检索对象的 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')

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

所以,而不是这个:

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

这样做:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM