一、前言:
django给我们提供了用户模块,用户模块中的模型类已经定义好,如果用户模块中提供的模型类字段完全符合我们的需求,直接继承即可;否则需要重写模型类
二、需求:
1、注册时必传字段用户名、密码、确认密码、邮箱
2、用户名只能输入5-20字符
3、密码只能输入5-20字符
4、确认密码只能输入5-20字符
5、注册成功后,响应结果返回用户id、用户名、token值。
提示:
1、django提供的user模型类中没有确认密码字段
2、邮箱为非必传字段
三、创建子应用users、注册子应用,已在登录接口中完成,不在这里做过多的说明
四、创建序列化文件,进行序列化操作
特别注意1:创建模型序列化器类:如果针对的模型类中的字段进行序列化和反序列话操作,那么定义模型序列化器类;
继承(serializers.ModelSerializer)。
特别注意2:如果不是针对模型类中字段进行序列化和反序列话操作,而是自己定义序列化字段,那么定义序列化器类;
继承(serializers.Serializer)
from django.contrib.auth.models import User
from rest_framework import serializers
from rest_framework.validators import UniqueValidator
from rest_framework_jwt.serializers import jwt_payload_handler, jwt_encode_handler
class RegisterModelSerializer(serializers.ModelSerializer):
password_confirm = serializers.CharField(label='确认密码', help_text='确认密码',
error_messages={"min_length": "允许输入5-20个字符",
"max_length": "允许输入5-20个字符", },
write_only=True)
token = serializers.CharField(label='token', help_text='token', read_only=True)
class Meta:
model = User
fields = ['id', 'username', 'password', 'password_confirm', 'token', 'email']
extra_kwargs = {
"username": {
"label": "用户名",
"help_text": "用户名",
"max_length": 20,
"min_length": 5,
"error_messages": {
"min_length": "允许输入5-20个字符",
"max_length": "允许输入5-20个字符",
},
"validators": [UniqueValidator(queryset=User.objects.all(), message='用户名已注册,请重新输入')]
},
"password": {
"label": "密码",
"help_text": "密码",
"max_length": 20,
"min_length": 5,
"error_messages": {
"min_length": "允许输入5-20个字符",
"max_length": "允许输入5-20个字符",
},
"write_only": True
},
"email": {
"label": "邮箱",
"help_text": "邮箱",
"max_length": 20,
"min_length": 5,
"required": True,
"write_only": True,
"validators": [UniqueValidator(queryset=User.objects.all(), message='邮箱已注册,请重新输入')]
}
}
# 校验密码与验证码密码
def validate(self, attrs):
password = attrs.get('password')
password_confirm = attrs.get('password_confirm')
if password_confirm != password:
raise serializers.ValidationError("密码和确认密码输入的不一致")
return attrs
def create_token(self, user):
payload = jwt_payload_handler(user)
return jwt_encode_handler(payload)
# 校验通过之后,创建模型对象
def create(self, validated_data):
user = User.objects.create_user(username=validated_data.get('username'),
password=validated_data.get('password'),
email=validated_data.get('email'),
)
token = self.create_token(user)
user.token = token
return user
特别注意3:extra_kwargs={}:只会对模型类已有的字段进行修改;
特别注意4:创建数据成功后,将模型对象作为输出的数据源,与模型字段进行比对,那些字段需要序列化输出
五、定义视图:
from django.contrib.auth.models import User
from rest_framework.mixins import CreateModelMixin
from rest_framework.response import Response
from rest_framework.viewsets import GenericViewSet
from users.serializers import RegisterModelSerializer
class RegisterViewSet(CreateModelMixin,
GenericViewSet):
queryset=User.objects.all()
serializer_classs=RegisterModelSerializer
六、定义路由:
采用路由器机制自动生成路由
from django.urls import path, include,re_path
from rest_framework import routers
from rest_framework_jwt.views import obtain_jwt_token
from users import views
from users.views import RegisterViewSet
router=routers.SimpleRouter()
router.register(r'register',RegisterViewSet)
urlpatterns=[
path('',include(router.urls))
]
七、测试:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/123272.html