使用相同的通用类视图Django Rest框架定义两个api端点?
我是Django的新手。我试图使用django泛型视图,基于类 我如何实现以下情况,我有两个api端点login/和logout/并且同一个视图类处理它使用相同的通用类视图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
# 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方法。总之,找到了一个继承的解决方案。将该解决方案添加到您的问题中,这可能会帮助其他人