Как реализовать логику регистрации и входа как API, используя ViewSet вместо общих представлений в Django Rest Framework
Я новичок в viewset при использовании Django Rest Framework для создания registration и login логики в качестве API с использованием ViewSet вместо общих представлений, и передавая ресурсы автономному фронтенд-приложению React на другом порту. В предыдущем проекте, где у меня была возможность использовать django template как frontend внутри проекта django, я просто использовал django Views для реализации логики регистрации и входа и шаблона, сделав следующее:
// MyOldMethod.py
@login_required
def index(request):
return render(request,'customers/index.html')
def signup(request):
context = {}
form = UserCreationForm(request.POST or None)
if request.method == "POST":
if form.is_valid():
user = form.save()
login(request,user)
return render(request,'customers/index.html')
context['form']=form
return render(request,'registration/signup.html',context)
Таким образом, базовая аутентификация входа была установлена. Теперь для этого случая мне нужно использовать viewset и serializer, а в конце подключить фронтенд-приложение React к API django с помощью axios. На данный момент я реализовал models.py, serializer.py и api.py, а также urls.py следующим образом в приложении customers.
// models.py внутри customers App
from django.db import models
from django.core.validators import RegexValidator
class Customer(models.Model):
name = models.CharField(max_length=100)
phone_regex = RegexValidator(regex=r'^\+?1?\d{9,15}$', message="Phone number must be entered in the format: '+999999999'. Up to 15 digits allowed.")
phone = models.CharField(validators=[phone_regex], max_length=17, blank=True) # validators should be a list
email = models.EmailField()
activated = models.BooleanField(default=False)
message = models.CharField(max_length=300)
created_at = models.DateTimeField(auto_now_add=True)
def _str_(self):
return self.name
// serializers.py внутри клиентов App
from rest_framework import serializers
from .models import Customer
class CustomerSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
fields = '__all__'
// serializers.py внутри клиентов App
from rest_framework.decorators import permission_classes
from Customer.models import Customer
from rest_framework import viewsets, permissions
from .serializers import CustomerSerializer
class CustomerViewSet(viewsets.ModelViewSet):
queryset = Customer.objects.all()
permission_classes = [
permissions.AllowAny
]
serializer_class = CustomerSerializer
// urls.py внутри customers App
from rest_framework import routers, urlpatterns
from .api import CustomerViewSet
router = routers.DefaultRouter()
router.register('api/customer', CustomerViewSet, 'customer')
urlpatterns = router.urls
Проблема с этой реализацией, основанной на моем ограниченном понимании viewset, заключается в том, что я не знаю, как написать логику регистрации и входа в систему с помощью viewset, как я это сделал в MyOldMethod.py. Я буду очень признателен за любую помощь в достижении этой цели и более близкое знакомство с арканой viewset, потому что среди предопределенных действий (list, create, retreive, update, partial_update, destroy) я не увидел ни одного, которое помогло бы реализовать аутентификацию и логику регистрации и входа, как я делал раньше с помощью общих представлений. Заранее спасибо.
Вы можете получить много информации о ModelViewSet здесь.
Если говорить о вашем вопросе, то его можно решить разными способами.
Вы можете переопределить create()
в CustomerSerializer:
class Customererializer(serializers.ModelSerializer):
# ....
def create(self, validated_data):
customer = Customer.objects.create(**validated_data)
return customer
Другим решением является написание собственного метода create в классе viewset:
class CustomerViewSet(viewsets.ModelViewSet):
def create(self, request, format=None):
# create user here