20

我在文档中使用 SimpleRouter tuorial。

只是为了测试我创建了一个临时的身份验证类:

class BackboneBasicAuthentication(authentication.BaseAuthentication):
    def authenticate(self, request):
        user = User.objects.filter(username="james")
        return (user, None)

设置看起来像这样

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'core.rest_authentication.BackboneBasicAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
       'rest_framework.permissions.AllowAny',
    ),
}

提交 PUT 请求会返回 405 METHOD NOT ALLOWED

{"detail": "Method 'PUT' not allowed."}

我也尝试过 X-HTTP-Method-Override 。不去。

任何想法我做错了什么?

我花了一整天的时间试图解决这个问题,希望有人能提供帮助!:)

4

2 回答 2

20

简单的路由器将 put 属性添加到与您提供的模式匹配的 url 的视图中,并将 pk 添加为附加模式元素。

例如,如果您使用:

simple_router.register('widgets/', WidgetViewSet)

该框架将创建两个 url 模式:

'^widgets/$'
'^widgets/<?P<pk>[^/]+/$'

我猜你只是在尝试满足第一个匹配的url,视图集实例将只具有框架添加的'get'('list')和'post'('create')支持,所以它会导致错误您正在查看是否尝试放置/修补或删除。要使这些方法起作用,您需要提供 pk 以便框架知道您正在修改或删除哪个小部件,并且您的 url 与支持这些方法的视图相匹配。

这很令人困惑,如果您觉得 simple_router 太令人困惑,您可以选择根本不使用它。然后您可以指定自己的方法映射,以便 rest_framework 将分派到您的 put 方法,例如

url('^widgets/<?P<pk>[^/]+/$', WidgetViewSet.as_view({'put': 'update', 
                                                      'get': 'retrieve', 
                                                      'patch': 'partial_update', 
                                                      'delete': 'destroy'}...)
于 2013-11-20T23:21:50.780 回答
9

对我来说,这似乎是由路由视图集未实现或不允许 PUT 请求引起的。如果是身份验证问题,您将获得401 UNAUTHORIZED状态码。

于 2013-06-18T08:24:23.113 回答