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-oauth-toolkit 使用 Django-rest-framework 测试 API 端点以进行身份验证
如何向 Django Celery Flower Monitoring 添加身份验证和端点?
无法使用用户名/密码登录令牌端点:drf 令牌身份验证和自定义用户模型,Django