#django #django-rest-framework
#django #django-rest-framework
Вопрос:
Я знаю, что в этом ответе есть много ответов и много разных способов сделать это, но на сегодняшний день в Django 3 я хочу знать, какой из них является лучшим и надежным способом использовать только электронную почту для аутентификации.
РЕДАКТИРОВАТЬ: я нашел ссылку, но не подтвердил, есть ли у нее какие-либо недостатки
Комментарии:
1. Если вы когда-либо пытались решить свою проблему, то вы можете поделиться своим кодом здесь, чтобы посмотреть, где вы застряли.
2. @xxnora пожалуйста, проверьте, что я отредактировал вопрос
Ответ №1:
Вы можете создать свой пользовательский, serializers
а затем поместить логику для проверки через authenticated by email
следующим образом:
serializers.py :
from rest_framework import serializers
from django.db.models import Q
from django.contrib.auth import get_user_model
User = get_user_model()
class UserLoginSerializers(serializers.ModelSerializer):
email = serializers.CharField()
password = serializers.CharField(write_only=True)
class Meta:
model = User
fields = [
"email",
"password",
]
def validate(self, data):
email = data['email']
password = data['password']
user_queryset = User.objects.filter(Q(email__iexact=email) | Q(username__iexact=email)).distinct()
if user_queryset.exists() and user_queryset.count() == 1:
user_set = user_queryset.first()
if user_set.check_password(password):
user = user_set
print(user)
else:
raise serializers.ValidationError("Incorrect Password!")
else:
raise serializers.ValidationError("Not Valid User!")
return data
views.py :
from rest_framework.views import APIView
from rest_framework.response import Response
from rest_framework.status import (
HTTP_200_OK, HTTP_201_CREATED, HTTP_400_BAD_REQUEST
)
from .serializers import (UserLoginSerializers)
class UserLoginAPIView(APIView):
serializer_class = UserLoginSerializers
def post(self, request, format=None):
data = request.data
user_serilaizer = UserLoginSerializers(data=data)
if user_serilaizer.is_valid():
new_data = user_serilaizer.data
return Response(new_data, status=HTTP_200_OK)
else:
return Response({"msg":"invalid user"}, status=HTTP_400_BAD_REQUEST)
urls.py :
from django.urls import path
from account.api.views import (UserLoginAPIView)
urlpatterns = [
path('api/login', UserLoginAPIView.as_view(), name='login_api'),
]
Комментарии:
1. Это решило ваш вопрос? если это так, пожалуйста, примите это как ответ. так что другие люди могут быть полезны. спасибо 🙂
Ответ №2:
ИМЯ_ПОЛЬЗОВАТЕЛЯ
Строка, описывающая имя поля в модели пользователя, которое используется в качестве уникального идентификатора. Обычно это какое-либо имя пользователя, но это также может быть адрес электронной почты или любой другой уникальный идентификатор.