Django REST框架 - 405方法不允许使用SimpleRouter

Rad*_*Hex 19 django http backbone.js django-rest-framework

我在文档中使用SimpleRouter tuorial.

只是为了测试我已经创建了一个临时的Authentication类:

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

设置看起来像这样

REST_FRAMEWORK = {
    'DEFAULT_AUTHENTICATION_CLASSES': (
        'core.rest_authentication.BackboneBasicAuthentication',
    ),
    'DEFAULT_PERMISSION_CLASSES': (
       'rest_framework.permissions.AllowAny',
    ),
}
Run Code Online (Sandbox Code Playgroud)

提交PUT请求将返回405 METHOD NOTOWOWED

{"detail": "Method 'PUT' not allowed."}
Run Code Online (Sandbox Code Playgroud)

我也尝试过使用X-HTTP-Method-Override.不行.

我有什么想法我做错了吗?

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

Pau*_*ipp 19

简单的路由器将put属性添加到视图中,以便为与您提供的模式匹配的URL添加作为附加模式元素添加的pk.

例如,如果您使用:

simple_router.register('widgets/', WidgetViewSet)
Run Code Online (Sandbox Code Playgroud)

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

'^widgets/$'
'^widgets/<?P<pk>[^/]+/$'
Run Code Online (Sandbox Code Playgroud)

我猜你只是在尝试满足第一个匹配的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'}...)
Run Code Online (Sandbox Code Playgroud)


Luk*_*ger 8

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