03-07 后端短信注册接口

一. urls.py

router = SimpleRouter()
router.register('register', views.RegisterAPIView, 'register')  # -> actions={post: create}
urlpatterns = [
    path('', include(router.urls)),
]

二. serializers.py

class RegisterModelSerializer(serializers.ModelSerializer):
    code = serializers.CharField(write_only=True)
    """
    提示: 如果code不指定 write_only. 在序列化的时候, 库中没有, 当然会抛出异常
    Got AttributeError when attempting to get a value for field `code` on serializer `RegisterModelSerializer`.
The serializer field might be named incorrectly and not match any attribute or key on the `User` instance.
Original exception text was: 'User' object has no attribute 'code'.
    """

    class Meta:
        model = models.User
        fields = ('telephone', 'password', 'code', 'username')
        extra_kwargs = {
            'username': {'read_only': True},
            'password': {'min_length': 6, 'max_length': 16}
        }

    def validate(self, attrs):
        """
        1. 判断用户手机号码格式是否符合标准
        2. 通过用户密码到缓存中获取用户验证码与用户输入的验证码是否一致.
        """
        # 15870638044  13861015437
        telephone = attrs.get('telephone')
        code = attrs.get('code')

        if re.match(r'1[3-9][0-9]{9}$', telephone):
            # PHONE_CODE_KEY
            cache_code = cache.get(settings.PHONE_CODE_KEY % telephone)
            if cache_code == code:
                attrs['username'] = telephone
                attrs.pop('code')
                utils.log.info(f'attrs: {attrs}')
                return attrs
            raise ValidationError('验证码不正确!')
        raise ValidationError('手机号码输入有误!')

    def create(self, validated_data):
        utils.log.info(f'validate_data: ', validated_data)
        user = models.User.objects.create_user(**validated_data)
        '''
        当数据库中存在时, 因为User表继承的AbstractUser. 因此username就是唯一字段. 存数据的时候, 如果数据库中有的化, 就会抛出异常了!!
        1062, "Duplicate entry '13861015437' for key 'username'"
        '''
        return user

三. views.py

class RegisterAPIView(CreateModelMixin, GenericViewSet):
    queryset = models.User.objects.all()
    serializer_class = serializer.RegisterModelSerializer

    def create(self, request, *args, **kwargs):
        response = super().create(request, *args, **kwargs)
        username = response.data.get('username')
        return utils.APIResponse(username=username)
posted @ 2020-07-26 21:03  给你加马桶唱疏通  阅读(119)  评论(0编辑  收藏  举报