一、判断账号是否存在:
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()