Django - PUT 端点验证器错误“wrapped_view() 缺少 1 个必需的位置参数:'request'”

Posted

技术标签:

【中文标题】Django - PUT 端点验证器错误“wrapped_view() 缺少 1 个必需的位置参数:\'request\'”【英文标题】:Django - PUT endpoint authenticator error "wrapped_view() missing 1 required positional argument: 'request'"Django - PUT 端点验证器错误“wrapped_view() 缺少 1 个必需的位置参数:'request'” 【发布时间】:2021-11-13 08:56:59 【问题描述】:

所以我正在尝试创建一个 PUT 端点来编辑帖子数据。在端点中,帖子 id 在 URL 中给出,然后新的帖子日期被插入到实体中。我遇到的问题是请求没有通过身份验证器(我使用 Cognito 进行身份验证,对于错误来说不是超级重要)。因此,即使您可以看到我清楚地传递了数据,但请求并没有通过 cognito_authenticator 函数中的 wrapped_view 传递。为什么会这样?我得到的错误是:

“wrapped_view() 缺少 1 个必需的位置参数:'request'”

Test.py

def test_edit(self):
    response = self.client.put(reverse('edit_post_by_id', kwargs='post_id': str(self.post.uuid)),
                               data='body': 'updated text #update',
                               content_type='application/json',
                               **'HTTP_AUTHORIZATION': f'bearer self.cognito.access_token')
    self.assertEqual(response.status_code, status.HTTP_200_OK)

查看.py

@api_view(['PUT'])
@method_decorator(cognito_authenticator)

def edit_post(request, post_id):
    try:
        post = Post.objects.get(pk=post_id)
    except Post.DoesNotExist:
        return JsonResponse(dict(error=f'Post id: post_id does not exists'), status=status.HTTP_400_BAD_REQUEST)

认证者

def cognito_authenticator(view_func=None):
    if view_func is None:
        return partial(cognito_authenticator)

    @wraps(view_func)
    def wrapped_view(request, *args, **kwargs):
        # Check the cognito token from the request.
        auth = request.headers.get("Authorization", None)
        if not auth:
            return Response(dict(error='Authorization header expected'), status=status.HTTP_401_UNAUTHORIZED)

        parts = auth.split()

        if parts[0].lower() != "bearer":
            return Response(dict(error='Authorization header must start with bearer'),
                            status=status.HTTP_401_UNAUTHORIZED)
        elif len(parts) == 1:
            return Response(dict(error='Token not found'), status=status.HTTP_401_UNAUTHORIZED)
        elif len(parts) > 2:
            return Response(dict(error='Authorization header must be Bearer token'),
                            status=status.HTTP_401_UNAUTHORIZED)

        token = parts[1]
        try:
            res = decode_cognito_jwt(token)
        except Exception:
            # Fail if invalid
            return Response("Invalid JWT", status=status.HTTP_401_UNAUTHORIZED)  # Or HttpResponseForbidden()
        else:
            # Proceed with the view if valid
            return view_func(request, *args, **kwargs)

    return wrapped_view

【问题讨论】:

【参考方案1】:

使用基于函数的视图,您不需要使用method_decorator 所以:

@api_view(['PUT'])
@cognito_authenticator
def edit_post(request, post_id):
    ...

【讨论】:

为什么不将method_decorator 用于基于函数的视图?它是如何工作的? 它用于类内的函数(非静态方法),因此如果您的函数不在类内,则不需要使用它。你可以阅读更多here

以上是关于Django - PUT 端点验证器错误“wrapped_view() 缺少 1 个必需的位置参数:'request'”的主要内容,如果未能解决你的问题,请参考以下文章

网络错误 Django 后端反应前端

如何使用 Django-oauth-toolkit 使用 Django-rest-framework 测试 API 端点以进行身份​​验证

如何向 Django Celery Flower Monitoring 添加身份验证和端点?

无法使用用户名/密码登录令牌端点:drf 令牌身份验证和自定义用户模型,Django

django rest + axios put请求错误403

在前端 PUT 请求中返回内部服务器 500 错误 | Django Vue