Как передать данные сессии бэкенда django-rest-framewor на фронт-энд react?
Я пытаюсь сделать музыкальный контроллер с django backend и react frontend. Они работают на двух разных серверах localhost, 3000 и 8000. Я использую атрибут session_key сессии django, чтобы иметь возможность определить, кто является хозяином (человеком, который создал комнату). Если пользователь, использующий приложение во фронтенде, создает комнату и возвращается, чтобы создать другую комнату до истечения срока действия сессии, пользователь должен попасть в комнату, которую он создал, а не заставлять бэкенд создавать другую комнату. Моя проблема в том, что каждый раз, когда я нажимаю кнопку создания комнаты на frontend через несколько секунд после создания другой комнаты (очевидно, что сессия еще не истекла, поэтому я ожидаю, что меня отведут в предыдущую комнату), метод fetch возвращает новую комнату.
Вот представление в моем views.py, которое обрабатывает этот POST запрос:
class CreateRoomview(APIView):
# declaring the class we are going to serialize our data with.
serializer_class = CreateRoomSerializer
# manually defining the method we will use to handle post data from our frontend
def post(self, request, format=None):
'''
a check to see if in any of our rooms we have a room that that has a host with the
current session key. We are filtering out all those rooms that have a host with
the current session key.
'''
if not self.request.session.exists(self.request.session.session_key):
self.request.session.create()
serializer = self.serializer_class(data=request.data)
# if not Room.objects.filter(host=self.request.session.session_key).exists():
# # if the room does not exist, we create a session like that.
# self.request.session.create()
# we serialize our request data
serializer = self.serializer_class(data=request.data)
# check to see if the data we have serialized is valid
if serializer.is_valid():
# define those three attributes of our model to be those values.
guest_can_pause = serializer.data.get('guest_can_pause')
votes_to_skip = serializer.data.get('votes_to_skip')
host = self.request.session.session_key
# obtain a queryset with the newly defined host.
queryset = Room.objects.filter(host=host)
# if the queryset is not empty,
if queryset.exists():
# assign a room to the first entry in the queryset.
room = queryset[0]
# assign those room attributes to the values we defined above.
room.guest_can_pause = guest_can_pause
room.votes_to_skip = votes_to_skip
# do not create a new room, but rather,update the values we only
# only want to change
room.save(update_fields=['guest_can_pause', 'votes_to_skip'])
# if the queryset is empty,
else:
# create a room with the values specified
room = Room(host=host, guest_can_pause=guest_can_pause,
votes_to_skip=votes_to_skip)
room.save()
return Response(RoomSerializer(room).data, status=status.HTTP_201_CREATED)
Вот метод в одном из моих компонентов react frontend, который отправляет POST запрос:
handleRoomButtonClicked() {
const requestOptions = {
method: "POST",
headers: {
"Content-Type": "application/json",
},
body: JSON.stringify({
votes_to_skip: this.state.votes_to_skip,
guest_can_pause: this.state.guest_can_pause,
}),
};
fetch("http://127.0.0.1:8000/api/createroom/", requestOptions)
.then((response) => response.json())
.then((data) => console.log(data));
}
Основная информация
Я использую django-cors-headers, чтобы разрешить кросс-запросы, поскольку мой backend и frontend работают на двух разных портах.
У меня есть CORS_ALLOW_ALL_ORIGINS = True
в моем settings.py
.
Я пытался найти похожие вопросы на stack, но ни один не помог, я забыл сохранить их ссылки, чтобы я мог прикрепить их к этому вопросу