用戶註冊
阿新 • • 發佈:2018-12-08
model span div encode extra del serial 註冊 存在
請求方式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
---恢復內容結束---
用戶註冊