![](/img/trans.png)
[英]Django REST Framework (ModelViewSet), 405 METHOD NOT ALLOWED
[英]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.