# finish emai/username login api
This commit is contained in:
parent
8536e99eb7
commit
5d6983cffb
|
@ -15,13 +15,13 @@ class UserDetailSerializer(serializers.ModelSerializer):
|
||||||
class UserLoginSerializer(serializers.ModelSerializer):
|
class UserLoginSerializer(serializers.ModelSerializer):
|
||||||
token = serializers.CharField(allow_blank=True, read_only=True)
|
token = serializers.CharField(allow_blank=True, read_only=True)
|
||||||
username = serializers.CharField(required=False, allow_blank=True)
|
username = serializers.CharField(required=False, allow_blank=True)
|
||||||
email = serializers.EmailField(required=False, allow_blank=True)
|
# email = serializers.EmailField(required=False, allow_blank=True)
|
||||||
|
|
||||||
class Meta:
|
class Meta:
|
||||||
model = User
|
model = User
|
||||||
fields = [
|
fields = [
|
||||||
'username',
|
'username',
|
||||||
'email',
|
# 'email',
|
||||||
'password',
|
'password',
|
||||||
'token'
|
'token'
|
||||||
]
|
]
|
||||||
|
@ -35,15 +35,21 @@ class UserLoginSerializer(serializers.ModelSerializer):
|
||||||
def validate(self, data):
|
def validate(self, data):
|
||||||
user_obj = None
|
user_obj = None
|
||||||
username = data.get('username', None)
|
username = data.get('username', None)
|
||||||
email = data.get('email', None)
|
# email = data.get('email', None)
|
||||||
password = data.get('password', None)
|
password = data.get('password', None)
|
||||||
|
|
||||||
if not email and not username:
|
# if not email and not username:
|
||||||
|
# raise serializers.ValidationError('username or email is required to login.')
|
||||||
|
# user = User.objects.filter(
|
||||||
|
# Q(username=username) |
|
||||||
|
# Q(email=email)
|
||||||
|
# ).distinct()
|
||||||
|
if not username:
|
||||||
raise serializers.ValidationError('username or email is required to login.')
|
raise serializers.ValidationError('username or email is required to login.')
|
||||||
user = User.objects.filter(
|
user = User.objects.filter(
|
||||||
Q(username=username) |
|
Q(username=username) |
|
||||||
Q(email=email)
|
Q(email=username)
|
||||||
).distinct()
|
).distinct()
|
||||||
user = user.exclude(email__isnull=True).exclude(email__iexact='')
|
user = user.exclude(email__isnull=True).exclude(email__iexact='')
|
||||||
if user.exists() and user.count() == 1:
|
if user.exists() and user.count() == 1:
|
||||||
user_obj = user.first()
|
user_obj = user.first()
|
||||||
|
|
|
@ -1,13 +1,25 @@
|
||||||
from django.contrib.auth import get_user_model
|
from django.contrib.auth import get_user_model
|
||||||
|
from django.db.models import Q
|
||||||
from rest_framework.response import Response
|
from rest_framework.response import Response
|
||||||
from rest_framework.status import HTTP_201_CREATED, HTTP_400_BAD_REQUEST
|
from rest_framework.status import HTTP_201_CREATED, HTTP_400_BAD_REQUEST
|
||||||
from rest_framework.views import APIView
|
from rest_framework.views import APIView
|
||||||
from rest_framework.permissions import AllowAny
|
from rest_framework.permissions import AllowAny
|
||||||
from .serializers import UserLoginSerializer
|
from .serializers import UserLoginSerializer
|
||||||
|
from django.contrib.auth.backends import ModelBackend
|
||||||
|
|
||||||
User = get_user_model()
|
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):
|
class UserLoginAPIView(APIView):
|
||||||
permission_classes = [AllowAny]
|
permission_classes = [AllowAny]
|
||||||
serializer_class = UserLoginSerializer
|
serializer_class = UserLoginSerializer
|
||||||
|
|
|
@ -153,3 +153,8 @@ REST_FRAMEWORK = {
|
||||||
JWT_AUTH = {
|
JWT_AUTH = {
|
||||||
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=600),
|
'JWT_EXPIRATION_DELTA': datetime.timedelta(seconds=600),
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# Custom auth backend
|
||||||
|
# AUTHENTICATION_BACKENDS = (
|
||||||
|
# 'accounts.api.views.CustomBackend',
|
||||||
|
# )
|
Loading…
Reference in New Issue