new_candy

导航

用户注册

 

请求方式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

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

posted on 2018-09-15 22:02  new_candy  阅读(255)  评论(0编辑  收藏  举报