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

一、判断账号是否存在:

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

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

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

返回数据:JSON

返回值类型是否必传说明
usernamestr用户名
countint数量

返回数据示例:

{
	"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/
请求参数: 路径参数

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

返回数据: JSON

参数类型是否必传说明
mobilestr手机号
countint数量

返回数据示例:

{
	"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/

参数类型是否必传说明
usernamestr用户名
passwordstr密码
password2str确认密码
sms_codestr短息验证码
mobilestr手机号
allowstr是否同意协议

返回数据:JSON

返回值类型是否必传说明
idint用户id
usernamestr用户名
mobilestr手机号

业务逻辑:

  • 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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浅弋、璃鱼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值