54 lines
2.0 KiB
Python
54 lines
2.0 KiB
Python
from django.contrib.auth import get_user_model
|
|
from django.db.models import Q
|
|
from rest_framework import serializers
|
|
from rest_framework.response import Response
|
|
from rest_framework.status import HTTP_200_OK, HTTP_201_CREATED, HTTP_400_BAD_REQUEST
|
|
from rest_framework.views import APIView
|
|
from rest_framework.generics import RetrieveAPIView
|
|
from rest_framework.permissions import AllowAny, IsAuthenticated
|
|
from rest_framework_jwt.serializers import VerifyJSONWebTokenSerializer
|
|
from .serializers import UserLoginSerializer, UserDetailSerializer
|
|
from django.contrib.auth.backends import ModelBackend
|
|
|
|
User = get_user_model()
|
|
|
|
|
|
class CustomBackend(ModelBackend):
|
|
def authenticate(self, request, username=None, password=None, **kwargs):
|
|
try:
|
|
user = User.objects.get(Q(username=username)|Q(email=username))
|
|
if user.check_password(password):
|
|
return user
|
|
except Exception as e:
|
|
return None
|
|
|
|
|
|
class UserLoginAPIView(APIView):
|
|
permission_classes = [AllowAny]
|
|
serializer_class = UserLoginSerializer
|
|
|
|
def post(self, request, *args, **kwargs):
|
|
data = request.data
|
|
serializer = UserLoginSerializer(data=data)
|
|
if serializer.is_valid(raise_exception=True):
|
|
login_data = serializer.data
|
|
return Response(login_data, HTTP_201_CREATED)
|
|
else:
|
|
return Response(serializer.errors, HTTP_400_BAD_REQUEST)
|
|
|
|
|
|
class UserDetailAPIView(RetrieveAPIView):
|
|
serializer_class = UserDetailSerializer
|
|
permission_classes = [AllowAny]
|
|
|
|
def get(self, request, *args, **kwargs):
|
|
token = request.GET.get('token', None)
|
|
data = {'token': token}
|
|
try:
|
|
valid_data = VerifyJSONWebTokenSerializer().validate(data)
|
|
user = valid_data['user']
|
|
serializer = self.get_serializer(user)
|
|
return Response(serializer.data, HTTP_200_OK)
|
|
except serializers.ValidationError as v:
|
|
print("validation error", v)
|