Django DRF 3.9.2破坏了我的ViewSet操作

时间:2019-03-06 13:41:29

标签: python django-rest-framework

我已将DRF更新为3.9.2,现在我的操作异常奇怪:

  ...
  File "/usr/local/lib/python3.5/site-packages/rest_framework/views.py", line 455, in handle_exception
    self.raise_uncaught_exception(exc)
  File "/usr/local/lib/python3.5/site-packages/rest_framework/views.py", line 492, in dispatch
    response = handler(request, *args, **kwargs)
TypeError: 'str' object is not callable

仔细检查后,似乎将处理程序方法简单地定义为'Name',因此尝试调用字符串会导致TypeError

# Get the appropriate handler method
if request.method.lower() in self.http_method_names:
    # request.method.lower() is 'post' so self.post returns 'Name'
    handler = getattr(self, request.method.lower(),
                      self.http_method_not_allowed)
else:
    handler = self.http_method_not_allowed

这是我的观点:

class ValidateViewSet(viewsets.ViewSet):

    @action(methods=('post',), detail=False, permission_classes=())
    def name(self, request):
        response, code = self.validate(request.data, NameSerializer)
        return Response(response, code)

这是我的注册方式:

router = SimpleRouter()
router.register(
    'customer/register/validate',
    contact_registration.ValidateViewSet,
    'customer-register-validate',
)

这在3.8.2中可以很好地工作,但我不确定3.9.0以后的更改是否已经不再适用。

编辑:好像将动作从name重命名为其他可以解决的问题,name是否以某种方式保留了?

编辑:在完成3.9.0 PR之后,我怀疑this是元凶,因为它引入了一个名为name的类变量。我认为,如果不固定,至少应该记录在案。

编辑:Issue raised,似乎最好的选择是更明确地记录这些内容。

0 个答案:

没有答案