【问题标题】:How can I structure a Django REST API for a lot of similar online games?如何为许多类似的在线游戏构建 Django REST API?
【发布时间】:2022-01-12 20:54:40
【问题描述】:

我对 Django 和 Django REST 框架非常陌生,我想为 4 个相对相似的游戏实现 API。最基本的游戏包括玩家标记图像并为此获得分数,如果他们输入与相同图像的共同玩家相同的标签。一场比赛由 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 请求(我仍在处理这些请求)。我也只是为这个 Web 应用程序做后端,所以我只能用我迄今为止用 Python(使用 tkinter)编写的 GUI 来测试所有这些。 我正在努力解决的是:如何将视图相互连接,以使游戏逻辑正常工作?还是我必须为每个游戏编写一个视图并为此编写一个单独的序列化? 更好的说法是 - 我如何使游戏的后端与这些视图一起工作?我错过了什么?

【问题讨论】:

  • 嗨,我不知道我是否理解 100%,但我们无法将一个视图连接到另一个视图,但无论如何你不需要,如果我正在做这个,我会怎么做,是创建那些游戏视图(我不知道你的后端如何)并为每个游戏创建一个视图,用户需要使用来自回合的数据和视图调用函数来更新回合数,检查点等。
  • 您好,谢谢您的回答。这意味着我使用基于函数的视图,对吧?
  • 不是真的,你可以使用你写的这个视图,只是在它们里面调用一个函数
  • 那么在另一个视图中调用一个视图的函数?
  • 我给你写了一个答案,让你更清楚我想解释什么

标签: python django api django-rest-framework


【解决方案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 <= 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 之类的函数来执行所需的操作

【讨论】:

  • 我有类似的代码,但在 APIView 类中的 post 方法中。你是说视图集更适合这类问题吗?
猜你喜欢
  • 1970-01-01
  • 2011-05-13
  • 2018-09-23
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 2011-08-11
相关资源
最近更新 更多