三十一、实战演练之用户注册接口设计

1. 普通用户注册

(1)接口名称:

请求方式: POST

参数格式: JSON

(2)请求参数:

参数

变量名

类型

说明

是否必传

用户名

username

字符串

用户名

密码

password

字符串

密码

确认密码

password_confirm

字符串

确认密码

邮箱

email

字符串

邮箱

手机号码

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')

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值