使用相同的通用类视图定义两个api端点Django Rest Framework?

时间:2018-07-31 09:43:46

标签: django django-rest-framework

我是Django的新手。我试图使用基于类的django通用视图。

如何实现以下情况,我有两个api端点login /和logout /,并且同一个视图类可以处理它?<​​/ p>

# Login and logout
class SignInActivity(generics.RetrieveUpdateAPIView):

    serializer_class = UserSerializer
    request = None

    def get_queryset(self):
        return User.objects.filter(Q(username=self.request.data["username"])
                               & Q(userpassword=self.request.data["userpassword"]))

    def update(self, request, *args,  **kwargs):
        self.request = request
        query_set = self.get_queryset()

        if bool(query_set):
            query_set.update_or_create(username=self.request.data["username"],
                                   userpassword=self.request.data["userpassword"],
                                   defaults={
                                        "lastlogin": timezone.now()
                                    })
            return Response(data={"message": "User logged in successfully.", "response_code": 222}, status=201)
        else:
            return Response(data={"message": "User not found.", "response_code": 444}, status=201)

我的urls.py是

path('login/', SignInActivity.as_view())

此实现使用此类PUT方法使login /麻烦。现在我可以将同一个类与其他方法一起使用来处理注销/ PUT方法吗?

3 个答案:

答案 0 :(得分:1)

默认情况下, generics.RetrieveUpdateAPIView 提供3种HTTP方法,分别是GETPUTPATCH。您可以将以下任何一种方法覆盖到logout过程中。

class SignInActivity(generics.RetrieveUpdateAPIView):
    serializer_class = UserSerializer
    request = None

    def get_queryset(self):
        return User.objects.filter(Q(username=self.request.data["username"])
                                   & Q(userpassword=self.request.data["userpassword"]))

    def update(self, request, *args, **kwargs):
        return Response(data="HTTP PUT method")

    def partial_update(self, request, *args, **kwargs):
        return Response(data="HTTP PATCH method")

    def retrieve(self, request, *args, **kwargs):
        # your log-out logic
        return Response(data="HTTP GET method")


我认为您可以使用 retrieve() 方法执行注销过程,因为我认为无需发送额外的有效负载到端点

答案 1 :(得分:1)

我认为不可能将两个端点指向相同视图类的相同方法函数(POST或PUT)。

解决方案之一是使用继承,其中可以有一个基类以及从该类继承的登录和注销端点类,然后在子类中实现各自的方法功能。

因此,基本上,两个端点仍将使用具有继承的公共属性的不同类的函数。

答案 2 :(得分:0)

class SignInActivity(generics.RetrieveUpdateAPIView):

应该是

from rest_framework.views import APIView
class SignInActivity(APIView):

Urls.py

path('login/', SignInActivity.as_view()),
path('logout/', SignInActivity.as_view())

这样做的事实是,当我们的domain.com/logout/收到请求时,它将转发到SignInActivity视图,以及在domain.com/login/上收到请求时!