django rest post返回405错误代码

时间:2015-06-16 08:39:39

标签: django django-rest-framework

我正在使用django和rest框架,我尝试在现有对象上测试POST,但我一直得到405.我的ViewSet看起来像这样:

class Agents(viewsets.ModelViewSet):
    serializer_class = serializer.AgentSerializer
    model = serializer_class.Meta.model
    ....

并在网址中:

router = routers.SimpleRouter()
router.register(r'rest/agents', api_views.Agents, "Agent")
...
urlpatterns += router.urls

我在APITestCase类中调用post请求(休息测试),我的帖子请求如下所示:

response = self.client.post(url, {'available': True, 'online':True}, format='json')

并且打印网址显示“/ chat / rest / agents / 1910_1567 /”,而1910_1567是现有代理的有效ID(我在设置过程中创建代理并使用其ID)。

我已经看到有关休息后获得405的其他问题,但所有解决方案都与网址相关,在我的情况下,网址是正确的。我甚至在测试之外运行了设置,并通过浏览器访问了url以获取对象,并且对象确实存在。但是当我尝试发布它时 - 405。

任何想法?

谢谢!

2 个答案:

答案 0 :(得分:1)

很可能你的url以某种方式与某些不同的url的正则表达式匹配,并且请求被分派给其他不允许发布请求的视图。你能在urls.py中提到其他网址吗?事实上,您可以通过在视图的调度方法中添加pdb(调试器)来验证这一点。如果你把它发给了pdb,那么你可以认为我错了。

如果不是这种情况,那么您可以使用调试器从dispatch方法评估问题。万一你对如何做到这一点有任何疑问 -

class Agents(viewsets.ModelViewSet):
     serializer_class = serializer.AgentSerializer
     model = serializer_class.Meta.model

     def dispatch(self, *args, **kwargs):
         import ipdb; ipdb.set_trace()
         return super(Agents, self).dispatch(*args, **kwargs)

找到解决方案: -

您正在url中传递id,因此此请求将路由到详细视图,而详细信息视图仅允许对资源进行GET,PUT,DELETE操作,因为资源已存在。所以要创建资源,不要提供id。否则使用PUT请求并为PUT中的创建提供支持。

答案 1 :(得分:1)

POST应该用于创建目的。如果您想使用ViewSet进行更新,则需要进行PUT或PATCH(部分更新)。

编辑: 有关此内容的更多信息,请参阅以下有关REST API使用的HTTP方法的一些说明: http://restful-api-design.readthedocs.org/en/latest/methods.html

DRF文档中也对此进行了描述: http://www.django-rest-framework.org/api-guide/routers/#simplerouter