python学习之美多商城(五):用户部分--判断账号/用户名/手机号是否重复、注册

版权声明:浅弋、璃鱼的原创 https://blog.csdn.net/qq_35709559/article/details/84940999

一、判断账号是否存在:

1.判断用户名是否存在:

后端接口设计:
请求方式:GET usernames/(?P<username>\w{5,20})/count/
请求参数: 路径传参

参数 类型 是否必传 说明
username str 用户名

返回数据:JSON

返回值 类型 是否必传 说明
username str 用户名
count int 数量

返回数据示例:

{
	"username":"python",
	"count":1
}

后端代码实现:

class CheckUsername(APIView):
    """验证用户名是否重复"""
    def get(self, request, name):
        """
        验证用户名是否重复
        url(r"usernames/(?P<name>\w{5,20})/count/",views.CheckUsername.as_view()),
        :param request:
        :param name:
        :return:
        """
        # 1.根据name查询数据库
        count = User.objects.filter(username=name).count()
        return Response({
            "count":count,
            "username":name
        })

2.判断手机号是否存在

后端接口设计:
请求方式: GET mobiles/(?P<mobile>1[3-9]\d{9})/count/
请求参数: 路径参数

参数 类型 是否必传 说明
mobile str 手机号

返回数据: JSON

参数 类型 是否必传 说明
mobile str 手机号
count int 数量

返回数据示例:

{
	"mobile":"13711111111",
	"count":0
}

后端实现:

class CheckMobileView(APIView):
    """检查手机号是否重复"""
    def get(self,request,mobile):
        """
        检车手机号是否已经存在,返回数量
        :param request:
        :param mobile:
        :return:
            "mobile":mobile
            "count":0
        """
        # 1.根据name查询数据库
        count = User.objects.filter(mobile=mobile).count()
        return Response({
            "count": count,
            "mobile":mobile
        })

3. 实现用户注册功能:

接口分析:
请求方式: POST&emso;/users/

参数 类型 是否必传 说明
username str 用户名
password str 密码
password2 str 确认密码
sms_code str 短息验证码
mobile str 手机号
allow str 是否同意协议

返回数据:JSON

返回值 类型 是否必传 说明
id int 用户id
username str 用户名
mobile str 手机号

业务逻辑:

  • 1.获取前端数据;
  • 2.验证数据
    • 序列化器验证;
  • 3.保存数据
    • 序列化器保存;
  • 4.返回数据

后端代码实现:

# views.py
class UserView(CreateAPIView):
    """
        实现用户注册功能
        url(r"^users/$", views.UserView.as_view()),
        传入的参数:
            allow: "true"
            mobile: "13711111111"
            password: "11111111"
            password2: "11111111"
            sms_code: "261800"
            username: "python"

    """
    serializer_class = UserSerializer
#servializers.py

class UserSerializer(serializers.ModelSerializer):
    """
    保存用户的序列化器
        allow: "true"
        mobile: "13711111111"
        password: "11111111"
        password2: "11111111"
        sms_code: "261800"
        username: "python"
    """# 对模型类中没有的字段仅进行反序列化输入
    password2 = serializers.CharField(max_length=20, min_length=8, write_only=True) 
    sms_code = serializers.CharField(max_length=6, min_length=6, write_only=True)
    allow = serializers.CharField(write_only=True)
    
    class Meta:
        model = User
        fields = ("id", "username", "mobile", "password", "password2", "sms_code", "allow")
        extra_kwargs = {
            # 对模型类中的字段添加规则
            "password":{
                "write_only": True,
                "max_length":20,
                "min_length":8
            },
            "username":{
                "max_length":20,
                "min_length":5
            }
        }
        
    def validated_mobile(self, value):
        """
        验证手机好格式
        :param value: 
        :return: 
        """
        if not re.match(r"1[3-9]\d{9}", value):
            raise serializers.ValidationError("手机号格式不正确")
        return value
    
    def validated_allow(self, value):
        """
        验证是否同意协议
        :param value: 
        :return: 
        """
        if value != "true":
            raise serializers.ValidationError("未同意协议")
        return value
    
    def validate(self, attrs):
        """
        验证密码和短信验证码
        :param attrs: 
        :return: 
        """
        # 验证密码
        if attrs["password"] != attrs["password2"]:
            raise serializers.ValidationError("两次密码不一致")
        
        # 短信验证码
        real_sms_code = SMSCodeView.checkSMSCode(attrs["mobile"])
        if real_sms_code is None:
            raise serializers.ValidationError("短信验证码过期")
        if real_sms_code != attrs["sms_code"]:
            raise serializers.ValidationError("短信验证码错误")
        
        return attrs
    
    
    def create(self, validated_data):
        """
        保存用户数据
        :param validated_data: 
        :return: 
        """
        # 1.删除无用数据 ==> 字典删除
        del validated_data["sms_code"]
        del validated_data["password2"]
        del validated_data["allow"]
        print("保存用户数据: %s" % validated_data)
        
        # 保存,使用模型累的管理器方法
        user = User.objects.create_user(**validated_data)
        # user = super().create(validated_data)
        # 3.将保存的数据返回
        return user
#验证短信验证码:
class SMSCodeView(APIView):
	"""短信验证码业务"""
	...
	@staticmethod
    def checkSMSCode(mobile):
        """
        验证短信验证码
        :param mobile: 
        :param sms_code: 
        :return: 
        """
        # 建立redis链接
        conn = get_redis_connection("verify_codes")
        real_sms = conn.get("sms_code_%s" % mobile)            
        return real_sms.decode()

猜你喜欢

转载自blog.csdn.net/qq_35709559/article/details/84940999