1. 普通用户注册
(1)接口名称:
请求方式: POST
参数格式: JSON
(2)请求参数:
参数 | 变量名 | 类型 | 说明 | 是否必传 |
用户名 | username | 字符串 | 用户名 | 是 |
密码 | password | 字符串 | 密码 | 是 |
确认密码 | password_confirm | 字符串 | 确认密码 | 是 |
邮箱 | | 字符串 | 邮箱 | 是 |
手机号码 | mobile | 字符串 | 手机号码 | 是 |
请求示例:
{
"username": "test",
"password": "123456",
"password_confirm": "123456",
"email": "test@test.com",
"mobile": "13888888888"
}
返回示例
响应状态码:201 响应数据:
{
"id": 8,
"username": "test",
"email": "test@test.com11",
"mobile": "13888888888"
}
(3)权限分析
所有人可以访问
(4)后端代码
1. 序列化器
注意点:
① password_confirm此字段模型中不存在,所以在创建的时候要删除掉,只是为了校验两次输入的密码是不是一样的。
② 如果模型中没有我想要的字段,可以在序列化器上去新增字段,或者去model中新增(需要重新迁移)。
③ 序列化器中修改模型字段的参数 extra_kwargs
④ 在序列器中添加email不可以重复的字段,可以在该字段的validators中添加一个UniqueValidator(queryset,message) ,也可以在model模块里添加unique = True。
⑤ 当注册成功返回的时候发现密码是明文的,而且是否需要返回密码?2个问题。
调用父类创建用户成功之后instance,然后用instance.set_password(instance.password),再把这个对象保存后并返回。
把密码设置为只写write_only,这个时候就是可以反序列化,不能序列化。
class RegisterSerializer(serializers.ModelSerializer):
# 此字段模型中不存在,所以在创建的时候要删除掉 下面有两种方法
password_confirm = serializers.CharField(label='确认密码', help_text='确认密码', max_length=20, min_length=6,
error_messages={"max_length": "仅允许6-20字符的密码",
"min_length": "仅允许6-20字符的密码"}, write_only=True, )
class Meta:
model = User
fields = ['id', 'username', 'password', 'mobile', 'password_confirm', 'email']
# 在序列化器中修改模型字段的参数
extra_kwargs = {
'username': {
'min_length': 6,
"max_length": 20,
"error_messages": {
"max_length": "仅允许6-20字符的用户名",
"min_length": "仅允许6-20字符的用户名"
}
},
'password': {
'min_length': 6,
"max_length": 20,
"write_only": True,
"error_messages": {
"max_length": "仅允许6-20字符的密码",
"min_length": "仅允许6-20字符的密码"
}
},
'email': {
'required': True,
# 在序列器中添加email不可以重复的字段,也可以在model模块里添加unique = True
'validators': [UniqueValidator(queryset=model.objects.all(), message='此邮箱已注册')]
}
}
# 校验两次密码输入是否一致
def validate(self, attrs):
password_confirm = attrs.get('password_confirm')
password = attrs.get('password')
if password_confirm != password:
raise ValidationError('两次输入的密码不一致')
# 创建之前删除password_confirm方法一:
# attrs.pop('password_confirm')
return attrs
# 创建之前删除password_confirm方法二:
def create(self, validated_data):
validated_data.pop('password_confirm')
instance = super().create(validated_data)
instance.set_password(instance.password)
instance.save()
return instance
# 若没有多对多的关系可如下:
# return User.objects.create_user(**validated_data)
2. 视图
注册用户只用到一个创建post方法,所以这里不需要指定查询集queryset
from rest_framework.generics import CreateAPIView
class RegisterViewSet(CreateAPIView):
serializer_class = RegisterSerializer
3. 路由
在路由中添加如下规则
path('register/', views.RegisterViewSet.as_view(), name='register')