我已将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,似乎最好的选择是更明确地记录这些内容。