#python #django #api #django-rest-framework
#питон #джанго #API #django-rest-фреймворк
Вопрос:
Я очень новичок в Django и фреймворке Django REST и хочу реализовать API для 4 относительно похожих игр. Самая простая игра состоит из того, что игрок помечает изображение и получает за это очки, если он вводит те же метки, что и его коллега для того же изображения. Одна игровая сессия состоит из 3 раундов.
То, что я сделал до сих пор, — это создал представление для типа игры, игровой сессии, игрового раунда, отображаемого изображения и меток, которые будут разделены на метки (пользователь использовал эту метку в качестве входных данных) и теги (несколько пользователей ввели одну и ту же метку для одного и того же изображения).
Все эти представления похожи на представления типа игры и тегов, приведенные ниже.
""" API View that handles retrieving the correct type of a game """ serializer_class = GametypeSerializer def get_queryset(self): gametypes = Gametype.objects.all().order_by("name") return gametypes def get(self, request, *args, **kwargs): gametype = self.get_queryset() serializer = GametypeSerializer(gametype, many=True) return Response(serializer.data) class Tagging(APIView): """ API View to do everything to do with taggings """ serializer_class = TaggingSerializer def get_queryset(self): taggings = Tagging.objects.all().filter(resource=8225) return taggings def get(self, request, *args, **kwargs): tagging = self.get_queryset() serializer = TaggingSerializer(tagging, many=True) return Response(serializer.data) def post(self, request, *args, **kwargs): tagging = request.data.get_queryset() serializer = TaggingSerializer(data=tagging) if serializer.is_valid(raise_exception=True): saved_tagging = serializer.save() return Response(saved_tagging)
Кроме того, для просмотра тегов и сеансов игр также потребуются запросы на публикацию (я все еще работаю над ними). Я также выполняю только бэкэнд для этого веб-приложения, поэтому я могу протестировать все это только с помощью графического интерфейса, который я написал на Python (с помощью tkinter) до сих пор. С чем я борюсь: как мне соединить представления друг с другом, чтобы логика игры работала правильно? Или мне нужно написать один просмотр для каждой игры и написать отдельный сериал для этого? Лучше сказать — как мне сделать бэкэнд игры функциональным с этими представлениями? Что я упускаю?
Комментарии:
1. Привет, я не знаю, понимаю ли я на 100%, но мы не можем подключить представление к другому, но вам все равно это не нужно, что бы я сделал, если бы работал над этим, это создал эти игровые представления (я не знаю, как ваш сервер) и создал представление для каждой из игр, пользователю нужно сделать запрос с данными из раунда и функциями вызова просмотра, чтобы обновить номер раунда, проверить очки и т. Д.
2. Привет, спасибо за ваш ответ. Это означало бы, что я использую представления, основанные на функциях, верно?
3. На самом деле нет, вы можете использовать эти представления, которые вы написали, просто вызовите функцию внутри них
4. Итак, вызовите функцию одного представления внутри другого?
5. Я написал вам ответ, чтобы прояснить, что я пытаюсь объяснить
Ответ №1:
если бы я это делал, я бы реализовал так
def check_the_player_token(token): # check logic here ... if valid_user: return True, user_token else: return False, '' class Tagging(viewsets.ViewSet): # post requests def create(self, request): # check the player of the token success, user = check_the_player_token(token) # check if the player is in this game # check if round is lt;= 3 # check the lable of the other player in database or if the label of other player wasn't added yet pass # get this player label and send to serializer serializer = TaggingLabelSerializer(data=request.data) if serializer.is_valid(): # save into database serializer.save() # update the current round # check if the label is right or wrong # return the response else: # return a error
Пометка набора представлений или ваш случай APIView получит запрос на публикацию и будет использовать такие функции, как check_the_player_token, для выполнения необходимых действий
Комментарии:
1. У меня есть аналогичный код, но в методе post в классе APIView. Вы хотите сказать, что наборы представлений лучше подходят для такого рода проблем?