1. 程式人生 > >用戶註冊

用戶註冊

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

---恢復內容結束---

用戶註冊