Как реализовать гостевой вход в Django REST FrameworkPython

Программы на Python
Anonymous
Как реализовать гостевой вход в Django REST Framework

Сообщение Anonymous »

В настоящее время у меня есть серверная часть, в которой пользователи могут зарегистрироваться, указав адрес электронной почты, имя и пароль. Эти поля обязательны для регистрации. Я хочу реализовать функцию гостевого входа, при которой гостевая учетная запись удаляется при закрытии браузера или выходе гостя из системы.
Как мне следует приступить к созданию гостевой учетной записи и какая информация должна быть предоставлена Включаю для гостевой учетной записи (адрес электронной почты, имя, пароль)?
Вот текущий код:
class CreateUserView(generics.CreateAPIView):
"""Create a new user in the system."""
serializer_class = UserSerializer
authentication_classes = [TokenAuthentication]
permission_classes = [permissions.UpdateOwnProfile]
filter_backends = (filters.SearchFilter,)
search_fields = ('name', 'email',)

class UserViewSet(viewsets.ModelViewSet):
"""List all users."""
queryset = User.objects.all()
serializer_class = UserSerializer
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]

class CreateTokenView(ObtainAuthToken):
"""Create a new auth token for user."""
serializer_class = AuthTokenSerializer
renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES

class UserLoginApiView(ObtainAuthToken):
"""Handle creating user authentication tokens."""
renderer_classes = api_settings.DEFAULT_RENDERER_CLASSES

class LogoutView(APIView):
"""Logout the authenticated user."""
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]

def post(self, request, *args, **kwargs):
request.user.auth_token.delete()
return Response(status=status.HTTP_200_OK)

class ManageUserView(generics.RetrieveUpdateAPIView):
"""Manage the authenticated user."""
serializer_class = UserSerializer
authentication_classes = [TokenAuthentication]
permission_classes = [IsAuthenticated]

def get_object(self):
"""Retrieve and return the authenticated user."""
return self.request.user

models.py
class UserManager(BaseUserManager):
"""Manager for user"""

def create_user(self, email, name, password=None, **extra_fields):
"""Create, save and return a new user."""
if not email:
raise ValueError('User must have an email address.')
user = self.model(email=self.normalize_email(email), name=name, **extra_fields)
user.set_password(password)
user.save(using=self._db)
return user

def create_superuser(self, email, name, password):
"""Create and save a new superuser with given details"""
user = self.create_user(email, name, password)
user.is_superuser = True
user.is_staff = True
user.save(using=self._db)
return user

class User(AbstractBaseUser, PermissionsMixin):
"""Database model for users in the system"""
id = models.AutoField(primary_key=True)
email = models.EmailField(unique=True)
name = models.CharField(max_length=50)
is_active = models.BooleanField(default=True)
is_staff = models.BooleanField(default=False)
phone_number = models.CharField(max_length=20, blank=True, null=True)
avatar_color = models.CharField(max_length=7)

objects = UserManager()

USERNAME_FIELD = 'email'
REQUIRED_FIELDS = ['name']

def save(self, *args, **kwargs):
if not self.pk:
self.avatar_color = random.choice([
'#FF5733', '#C70039', '#900C3F', '#581845',
'#8E44AD', '#1F618D', '#008000', '#A52A2A', '#000080'
])
super().save(*args, **kwargs)

def get_full_name(self):
"""Retrieve full name for user"""
return self.name

def __str__(self):
"""Return string representation of user"""
return self.email

serializers.py
"""Serializers for the user API View."""

from rest_framework import serializers
from django.contrib.auth import (
get_user_model,
authenticate,
)
from django.utils.translation import gettext as _

class UserSerializer(serializers.ModelSerializer):
"""Serializer for the user object."""

class Meta:
model = get_user_model()
fields = ['id', 'email', 'password', 'name', 'phone_number', 'avatar_color']
extra_kwargs = {
'email': {'required': False},
'password': {'required': False, 'write_only': True, 'style': {'input_type': 'password'}, 'min_length': 6},
'name': {'required': False},
'phone_number': {'required': False},
'avatar_color': {'read_only': True}
}

def create(self, validated_data):
"""Create and return a user with encrypted password."""
return get_user_model().objects.create_user(**validated_data)

def update(self, instance, validated_data):
"""Update and return user."""
password = validated_data.pop('password', None)
user = super().update(instance, validated_data)

if password:
user.set_password(password)
user.save()

return user

class AuthTokenSerializer(serializers.Serializer):
"""Serializer for the user auth token."""
email = serializers.EmailField()
password = serializers.CharField(
style={'input_type': 'password'},
trim_whitespace=False,
)

def validate(self, attrs):
"""Validate and authenticate the user."""
email = attrs.get('email')
password = attrs.get('password')
user = authenticate(
request=self.context.get('request'),
username=email,
password=password,
)
if not user:
msg = _('Unable to authenticate with provided credentials.')
raise serializers.ValidationError(msg, code='authorization')

attrs['user'] = user
return attrs


Подробнее здесь: https://stackoverflow.com/questions/787 ... -framework

Вернуться в «Python»