2

以前,我记录了我的基于函数的视图,如下所示:

@swagger_auto_schema(
    operation_id='ChangePassword',
    methods=['POST'],
    request_body=ChangePasswordSerializer,
    responses={
        '200': 'empty response body',
    })
def change_password(request):
    # code here

然后我们将视图切换到基于类的视图,所以我简单地将文档装饰器复制粘贴到post方法中:

class UserChangePasswordView(APIView):
    @swagger_auto_schema(
        operation_id='ChangePassword',
        methods=['POST'],
        request_body=ChangePasswordSerializer,
        responses={
            '200': 'empty response body',
        })
    def post(self, request):
        # code here 

然而,在运行这个装饰器时,drf_yasg抛出了异常

File "/usr/local/lib/python3.6/site-packages/drf_yasg/utils.py", line 126, in decorator
    assert all(mth in available_methods for mth in _methods), "http method not bound to view"

到底是怎么回事?这个错误信息是什么意思?

4

2 回答 2

1

请注意,在它的源代码核心drf-yasg提到

method并且methods是互斥的,并且只能在装饰具有多个 HTTP 请求方法的视图方法时出现。

如果您处理了一种以上的方法,那么methods这将是有效的。UserChangePasswordView.post()

于 2018-01-22T08:29:11.830 回答
0

事实证明,在装饰器中以及通过应用装饰器的方法的名称隐式指定视图的 HTTP 方法是无效的。

methods解决方案是简单地从装饰器 中删除密钥:

class UserChangePasswordView(APIView):
    @swagger_auto_schema(
        operation_id='ChangePassword',
        request_body=ChangePasswordSerializer,
        responses={
            '200': 'empty response body',
        })
    def post(self, request):
        # code here
于 2018-01-22T07:54:57.343 回答