Как можно структурировать Django REST API для множества похожих онлайн-игр?
Я очень новичок в Django и Django REST Framework и хочу реализовать API для 4 относительно похожих игр. Самая базовая игра состоит из того, что игрок наклеивает ярлык на изображение и получает за это очки, если он вводит те же ярлыки, что и его коллега по игре для того же изображения. Одна игровая сессия состоит из 3 раундов.
На данный момент я создал представление для типа игры, игровой сессии, раунда игры, изображения, которое будет показано, и меток, которые будут разделены на метки (пользователь использовал эту метку в качестве ввода) и метки (более одного пользователя ввели эту метку для одной и той же картинки).
Все эти представления выглядят аналогично представлениям Gametype и Tagging, представленным ниже.
"""
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)
Представления Tag Tagging и Gamesession также будут нуждаться в POST-запросах (я все еще работаю над ними). Я также делаю только бэкенд для этого веб-приложения, поэтому я могу протестировать все это только с помощью графического интерфейса, который я написал на Python (с помощью tkinter). Меня мучает вопрос: как связать представления друг с другом, чтобы логика игры работала правильно? Или я должен написать одно представление для каждой игры и написать для этого отдельный сериализованный файл? Лучше сказать - как мне сделать бэкенд игры функциональным с этими представлениями? Что я упускаю?
Если бы я делал это, то реализовал бы следующим образом
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 <= 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
Тег viewset, или в вашем случае APIView, получит запрос на пост и будет использовать функции типа check_the_player_token для выполнения необходимых действий