如何在Django Rest Framework中使用ViewSet而不是通用视图来实现注册和登录逻辑作为API



当使用Django Rest Framework创建注册登录逻辑作为API时,我是视图集的新手,使用viewset而不是通用视图,并将资源暴露给不同端口上的React独立前端应用程序。在之前的一个项目中,我有可能在django项目中使用django模板作为前端,我只是简单地使用djangoViews来实现注册和登录逻辑和模板:

//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,最后使用axios将React前端应用程序连接到django API。到目前为止,我在客户应用程序中实现了models.py、serializer.py和api.py以及urls.py。

//models.py内部客户应用

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内部客户应用

from rest_framework import serializers
from .models import Customer
class CustomerSerializer(serializers.ModelSerializer):
class Meta:
model = Customer
fields = '__all__'

//serializers.py内部客户应用

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内部客户应用

from rest_framework import routers, urlpatterns
from .api import CustomerViewSet
router = routers.DefaultRouter()
router.register('api/customer', CustomerViewSet, 'customer')
urlpatterns = router.urls

基于我对viewset的有限理解,这个实现的问题是,我不知道如何像在MyOldMethod.py中那样用viewset编写注册和登录逻辑。我真的很感激为实现这一目标所提供的任何帮助,并让我更加熟悉视图集的奥秘,因为在它的预定义操作(列表、创建、检索、更新、部分更新、销毁(中,我没有看到任何有助于实现注册和登录身份验证以及逻辑的操作,就像我以前在通用视图中所做的那样。提前谢谢。

您可以在此处获得有关ModelViewSet的许多信息
当涉及到你的问题时,有不同的方法来解决它。您可以覆盖CustomerSerializer:中的create()

class Customererializer(serializers.ModelSerializer):
# ....
def create(self, validated_data):
customer = Customer.objects.create(**validated_data)
return customer

另一个解决方案是,您可以在视图集类中编写自己的创建方法:

class CustomerViewSet(viewsets.ModelViewSet): 
def create(self, request, format=None):
# create user here

最新更新