KeyError: 'pick-number' при доступе к пользовательским заголовкам в представлении Django Rest Framework [duplicate]
Я работаю над API Django Rest Framework и столкнулся с KeyError при попытке получить доступ к пользовательским заголовкам в моем представлении. Ошибка возникает, когда я пытаюсь получить доступ к заголовку "pick_number" в моем confirmingPick1View. Отслеживание выглядит следующим образом:
Internal Server Error: /api/wager/pick1/confirm/
Traceback (most recent call last):
File "/home/gutsthakur/Projects/Betting App/.env/lib/python3.10/site-packages/django/core/handlers/exception.py", line 55, in inner
response = get_response(request)
File "/home/gutsthakur/Projects/Betting App/.env/lib/python3.10/site-packages/django/core/handlers/base.py", line 197, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/gutsthakur/Projects/Betting App/.env/lib/python3.10/site-packages/django/views/decorators/csrf.py", line 65, in _view_wrapper
return view_func(request, *args, **kwargs)
File "/home/gutsthakur/Projects/Betting App/.env/lib/python3.10/site-packages/django/views/generic/base.py", line 104, in view
return self.dispatch(request, *args, **kwargs)
File "/home/gutsthakur/Projects/Betting App/.env/lib/python3.10/site-packages/rest_framework/views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "/home/gutsthakur/Projects/Betting App/.env/lib/python3.10/site-packages/rest_framework/views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "/home/gutsthakur/Projects/Betting App/.env/lib/python3.10/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
raise exc
File "/home/gutsthakur/Projects/Betting App/.env/lib/python3.10/site-packages/rest_framework/views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "/home/gutsthakur/Projects/Betting App/wager/views.py", line 76, in post
"pick_number": request.headers["pick_number"],
File "/home/gutsthakur/Projects/Betting App/.env/lib/python3.10/site-packages/django/http/request.py", line 448, in __getitem__
return super().__getitem__(key.replace("_", "-"))
File "/home/gutsthakur/Projects/Betting App/.env/lib/python3.10/site-packages/django/utils/datastructures.py", line 308, in __getitem__
return self._store[key.lower()][1]
KeyError: 'pick-number'
В моем представлении я пытаюсь получить доступ к пользовательским заголовкам "Draw", "pick_number" и "bet_amount" для обработки ставки пользователя. Я ожидал, что доступ к этим заголовкам будет осуществляться напрямую без каких-либо проблем, но вместо этого я получаю KeyError для "pick_number", доступ к которому осуществляется как к 'pick-number'. Вот код views.py:
class confirmingPick1View(generics.GenericAPIView):
serializer_class = confirmingPick1Serializer
permission_classes = [permissions.IsAuthenticated]
authentication_classes = [JWTAuthentication]
@swagger_auto_schema(
manual_parameters=[
openapi.Parameter(
"Draw",
openapi.IN_HEADER,
description="Draw id",
type=openapi.TYPE_STRING,
),
openapi.Parameter(
"pick_number",
openapi.IN_HEADER,
description="Pick Number",
type=openapi.TYPE_NUMBER,
),
openapi.Parameter(
"bet_amount",
openapi.IN_HEADER,
description="Bet Amount",
type=openapi.TYPE_INTEGER,
),
]
)
def post(self, request):
data = request.data
serializer = self.get_serializer(
data=data,
context={
"user": request.user.id,
"draw_id": request.headers["Draw"],
"pick_number": request.headers["pick_number"],
"bet_amount": request.headers["bet_amount"],
},
)
serializer.is_valid(raise_exception=True)
try:
serializer.save()
return Response(
{"message": "Bet confirmed successfully."},
status=status.HTTP_200_OK,
)
except serializers.ValidationError as e:
return Response(
{"error": str(e)},
status=status.HTTP_400_BAD_REQUEST,
)
и команда curl, которую я использовал для тестирования API:
curl -X 'POST' \
'http://127.0.0.1:8000/api/wager/pick1/confirm/' \
-H 'accept: application/json' \
-H 'Draw: <UUID of the draw>' \
-H 'pick_number: 12' \
-H 'bet_amount: 100' \
-H 'Authorization: Bearer <your_token_here>' \
-H 'Content-Type: application/json' \
-H 'X-CSRFToken: <your_token_here>' \
-d '{
"is_confirmed": true
}'
Я не уверен, почему к заголовку pick_number обращаются как к 'pick-number'. Посоветуйте, как правильно обращаться к пользовательским заголовкам или что может быть причиной этой проблемы?