Django - Ошибка аутентификатора конечной точки PUT "wrapped_view() missing 1 required positional argument: 'request'"
Я пытаюсь создать конечную точку PUT для редактирования данных поста. В конечной точке id поста указывается в URL, затем новая дата поста вставляется в сущность. Проблема в том, что запрос не проходит через аутентификатор (я использую Cognito для аутентификации, что не очень важно для ошибки). Поэтому, хотя вы можете видеть, что я четко передаю данные, запрос не проходит через wrapped_view
в функции cognito_authenticator
. Почему это происходит? Ошибка, которую я получаю, выглядит следующим образом:
"wrapped_view() missing 1 required positional argument: '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)
View.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
При использовании представлений, основанных на функциях, вам не нужно использовать method_decorator
так:
@api_view(['PUT'])
@cognito_authenticator
def edit_post(request, post_id):
...