我是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方法吗?
答案 0 :(得分:1)
默认情况下, generics.RetrieveUpdateAPIView
提供3种HTTP方法,分别是GET
,PUT
,PATCH
。您可以将以下任何一种方法覆盖到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/上收到请求时!