我是Django REST框架的新手。有人能解释为什么我得到这样的错误,如果我做一个POST请求'/API/index/'
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模式中使用这个参数?
6条答案
按热度按时间6gpjuf901#
确保
http_method_names
中有**“POST”**。或者,你可以这样写:xggvc2p62#
最好不要在网址名称中使用空格。
所以,与此相反:
这样做:
niwlg2el3#
你只需要改变:
brccelvz4#
请将
import from rest_framework import generics
改为有许多通用的观点。
ListCreateAPIView
用于GET和POST,CreateAPIView
仅用于POST方法lvjbypge5#
你自己的评论是对的。您之前只包含了索引url。且主视图接收用于检索对象URL参数,因此您的新视图被解释为参数。我在URLs中遇到了同样的问题。py:
解决方案:
6fe3ivhb6#
也有问题,就这样解决了。
我以前的代码
这里的问题是,当我访问url
enroll/
时,django将请求Map到第一个匹配项,即<slug:slug>/
。我所要做的就是更改顺序,以便实际的Enroll视图优先。新代码