【效能平台】用户模块——注册接口开发(二)

一、前言:

django给我们提供了用户模块,用户模块中的模型类已经定义好,如果用户模块中提供的模型类字段完全符合我们的需求,直接继承即可;否则需要重写模型类
在这里插入图片描述

在这里插入图片描述

二、需求:

1、注册时必传字段用户名、密码、确认密码、邮箱
2、用户名只能输入5-20字符
3、密码只能输入5-20字符
4、确认密码只能输入5-20字符
5、注册成功后,响应结果返回用户id、用户名、token值。
提示:
1、django提供的user模型类中没有确认密码字段
2、邮箱为非必传字段

三、创建子应用users、注册子应用,已在登录接口中完成,不在这里做过多的说明

四、创建序列化文件,进行序列化操作

特别注意1:创建模型序列化器类:如果针对的模型类中的字段进行序列化和反序列话操作,那么定义模型序列化器类;
继承(serializers.ModelSerializer)。

特别注意2:如果不是针对模型类中字段进行序列化和反序列话操作,而是自己定义序列化字段,那么定义序列化器类;
继承(serializers.Serializer)

from django.contrib.auth.models import User
from rest_framework import serializers
from rest_framework.validators import UniqueValidator
from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler


class RegisterModelSerializer(serializers.ModelSerializer):
    password_confirm = serializers.CharField(label='确认密码', help_text='确认密码',
                                             error_messages={
    
    "min_length": "允许输入5-20个字符",
                                                             "max_length": "允许输入5-20个字符", },
                                             write_only=True)
    token = serializers.CharField(label='token', help_text='token', read_only=True)

    class Meta:
        model = User
        fields = ['id', 'username', 'password', 'password_confirm', 'token', 'email']

        extra_kwargs = {
    
    
            "username": {
    
    
                "label": "用户名",
                "help_text": "用户名",
                "max_length": 20,
                "min_length": 5,
                "error_messages": {
    
    
                    "min_length": "允许输入5-20个字符",
                    "max_length": "允许输入5-20个字符",
                },
                "validators": [UniqueValidator(queryset=User.objects.all(), message='用户名已注册,请重新输入')]

            },
            "password": {
    
    
                "label": "密码",
                "help_text": "密码",
                "max_length": 20,
                "min_length": 5,
                "error_messages": {
    
    
                    "min_length": "允许输入5-20个字符",
                    "max_length": "允许输入5-20个字符",
                },
                "write_only": True
            },
            "email": {
    
    
                "label": "邮箱",
                "help_text": "邮箱",
                "max_length": 20,
                "min_length": 5,
                "required": True,
                "write_only": True,
                "validators": [UniqueValidator(queryset=User.objects.all(), message='邮箱已注册,请重新输入')]
            }
        }

    # 校验密码与验证码密码
    def validate(self, attrs):
        password = attrs.get('password')
        password_confirm = attrs.get('password_confirm')
        if password_confirm != password:
            raise serializers.ValidationError("密码和确认密码输入的不一致")
        return attrs

    def create_token(self, user):
        payload = jwt_payload_handler(user)
        return jwt_encode_handler(payload)

    # 校验通过之后,创建模型对象
    def create(self, validated_data):
        user = User.objects.create_user(username=validated_data.get('username'),
                                        password=validated_data.get('password'),
                                        email=validated_data.get('email'),
                                        )
        token = self.create_token(user)
        user.token = token
        return user

特别注意3:extra_kwargs={}:只会对模型类已有的字段进行修改;

特别注意4:创建数据成功后,将模型对象作为输出的数据源,与模型字段进行比对,那些字段需要序列化输出

五、定义视图:

from django.contrib.auth.models import User
from rest_framework.mixins import CreateModelMixin
from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet

from users.serializers import RegisterModelSerializer


class RegisterViewSet(CreateModelMixin,
						GenericViewSet):
	queryset=User.objects.all()
	serializer_classs=RegisterModelSerializer

六、定义路由:

采用路由器机制自动生成路由

from django.urls import path, include,re_path
from rest_framework import routers
from rest_framework_jwt.views import obtain_jwt_token
from users import views
from users.views import RegisterViewSet

router=routers.SimpleRouter()
router.register(r'register',RegisterViewSet)
urlpatterns=[
	path('',include(router.urls))
]

七、测试:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/YZL40514131/article/details/124887826
今日推荐