我是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模式中使用此参数?
答案 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方法