Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/django/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用相同的通用类视图Django Rest框架定义两个api端点?_Django_Django Rest Framework - Fatal编程技术网

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

使用相同的通用类视图Django Rest框架定义两个api端点?,django,django-rest-framework,Django,Django Rest Framework,我是Django的新手。我试图使用django泛型视图,基于类 我如何实现以下情况,我有两个api端点login/和logout/并且同一个视图类处理它 # Login and logout class SignInActivity(generics.RetrieveUpdateAPIView): serializer_class = UserSerializer request = None def get_queryset(self): retur

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

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

# 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)
我的url.py是

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

此实现将login/与此类PUT方法结合使用。现在我可以将同一个类与另一个方法一起使用来处理注销/放置方法了吗?

默认情况下
泛型。RetrieveUpdateAppiview
提供了3个HTTP方法,它们是
GET
PUT
PATCH
。您可以覆盖以下任何方法以执行
注销
过程

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")
类的重要性(泛型.retrieveUpdateAppiview):
serializer\u class=UserSerializer
请求=无
def get_queryset(自我):
返回User.objects.filter(Q(username=self.request.data[“username”])
&Q(userpassword=self.request.data[“userpassword”])
def更新(自我、请求、*args、**kwargs):
返回响应(data=“HTTP PUT method”)
def部分更新(自我、请求、*args、**kwargs):
返回响应(data=“HTTP补丁方法”)
def检索(self、request、*args、**kwargs):
#您的注销逻辑
返回响应(data=“HTTP GET method”)


我认为您可以使用
retrieve()
方法来执行注销过程,因为不需要向端点发送额外的有效负载,我假设我认为不可能将两个端点指向同一视图类的同一方法函数(POST或PUT)

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

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

class SignInActivity(generics.RetrieveUpdateAPIView):
应该是

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

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

这应该是这样的,因为当我们的domain.com/logout/收到请求时,它会将其转发到SignenActivity视图,以及当通过domain.com/login/收到请求时

但是,如果我不重写上面的方法,那么我想这是不可能的。所以对于一个基于类的视图,我必须在每次定义一个新的端点时创建一个新的类,如果它们与我的案例中的方法相同。。。我不明白你的担心。实际上,你想实现什么?你不能将相同的端点指向同一视图类的相同方法(
PUT
),这正是我所关心的。通过某种路由和指定方法名的方式指向同一类的不同PUT方法。总之,找到了一个继承的解决方案。将该解决方案添加到您的问题中,这可能会帮助其他人