一. 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)