码迷,mamicode.com
首页 > 其他好文 > 详细

用户注册

时间:2018-12-07 22:31:35      阅读:260      评论:0      收藏:0      [点我收藏+]

标签:加密   创建用户   方法校验   er模型   EAP   ack   127.0.0.1   user   请求   

 

请求方式POST 请求路径 127.0.0.1:8000/users
前端需要传递username, password, password2, allow(是否同意使用协议), sms_code(短信验证码)

class CreateUserView(CreateAPIView):
    """用户注册接口"""
    # 指定序列化器
    serializer_class = CreateUserSerializer

 

 # 继承自Modelserializer利用用户模型类映射字段
 2 class CreateUserSerializer(serializers.ModelSerializer):
 3     """创建用户序列化器"""
 4 
 5     # 1 添加不存在于用户表中的字段校验规则
 6     password2 = serializers.CharField(label=确认密码, write_only=True)
 7     sms_code = serializers.CharField(label=短信验证码, write_only=True)
 8     allow = serializers.CharField(label=是否同意用户协议, write_only=True)
 9     # 添加token字段,用于注册成功后记录用户信息,登录功能状态保持
10     token = serializers.CharField(label=登录状态的token, read_only=True)
11 
12     # 2 在Meta中定义模型类
13     class Meta:
16         model = User
17         fields = [id, username, password, password2, sms_code, mobile, allow, token]
18         extra_kwargs = {
19             username: {
20                 min_length: 5,
21                 max_length: 20,
22                 error_messages: {
23                     min_length: 仅允许5-20个字符的用户名,
24                     max_length: 仅允许5-20个字符的用户名,
25                 }
26             },
27             password: {
28                 write_only: True,
29                 min_length: 8,
30                 max_length: 20,
31                 error_messages: {
32                     min_length: 仅允许8-20个字符的密码,
33                     max_length: 仅允许8-20个字符的密码,
34                 }
35             }
36         }
37 
38     # 自定义单个字段验证行为
39     def validate_mobile(self, value):
40         """验证手机号格式是否正确"""
41         if not re.match(r^1[3-9]\d{9}$, value):
42             raise serializers.ValidationError(手机号格式错误)
43 
44         return value
45 
46     def validate_allow(self, value):
47         """验证用户是否同意注册协议"""
48         if value != true:
49             raise serializers.ValidationError(请同意用户协议)
50 
51         return value
52 
53     # 自定义多个字段验证行为
54     def validate(self, attr):
55         # 1 判断2次输入的密码是否正确
56         if attr[password] != attr[password2]:
57             raise serializers.ValidationError(两次验证码输入不同)
58         # 2 判断输入的短信验证码是否正确
59         sms_code = attr[sms_code]
60         real_sms_code = get_redis_connection(verify_codes).get(sms_%s % attr[mobile])
61         # 短信验证码找不到或已过期
62         if not real_sms_code:
63             raise serializers.ValidationError(无效的短信验证码)
64         # 短信验证码不一致
65         if sms_code != real_sms_code.decode():
66             raise serializers.ValidationError(短信验证码错误)
67 
68         return attr
69 
70     def create(self, validated_data):
71         # validate方法校验完成的字段的返回值传递给validated_data
72         # 将仅用于校验的字段删除                
73         validated_data.pop(sms_code)
74         validated_data.pop(password2)
75         validated_data.pop(allow)
76 
77         # 创建用户对象
78         user = User.objects.create(**validated_data)
79 
80         # 用django的认证加密去加密密码
81         user.set_password(validated_data[password])
82         user.save()
83 
84         # 手动签发jwt
85         jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
86         jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
87 
88         payload = jwt_payload_handler(user)
89         token = jwt_encode_handler(payload)
90 
91         # 将生成的token内容添加到user模型类中
92         user.token = token
93 
94         return user

附: jwt_token的链接https://www.cnblogs.com/zyxzyy/p/9985648.html

---恢复内容结束---

用户注册

标签:加密   创建用户   方法校验   er模型   EAP   ack   127.0.0.1   user   请求   

原文地址:https://www.cnblogs.com/zyxzyy/p/10085515.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!