Django商城项目笔记No.8用户部分-注册接口实现
Django商城项目笔记No.8用户部分-注册接口实现


users的view.py中增加如下代码
class RegisterUserView(CreateAPIView):
"""
用户注册视图
"""
serializer_class = serializers.RegisterUserSerializer
在users中创建serializers.py
class RegisterUserSerializer(serializers.ModelSerializer):
"""用户注册序列化器"""
password2 = serializers.CharField(label='确认密码', write_only=True)
sms_code = serializers.CharField(label='短信验证码', write_only=True)
allow = serializers.CharField(label='同意协议', write_only=True) class Meta:
model = User
fields = ('id', 'username', 'password', 'password2', 'sms_code', 'mobile', 'allow')
extra_kwargs = {
'username': {
'min_length': 5,
'max_length': 20,
'error_messages': {
'min_length': '仅允许5-20个字符的用户名',
'max_length': '仅允许5-20个字符的用户名',
}
},
'password': {
'write_only': True,
'min_length': 8,
'max_length': 20,
'error_messages': {
'min_length': '仅允许8-20个字符的密码',
'max_length': '仅允许8-20个字符的密码',
}
}
} def validate_mobile(self, value):
"""验证手机号"""
if not re.match(r'^1[3-9]\d{9}$', value):
raise serializers.ValidationError('手机号格式错误')
return value def validate_allow(self, value):
"""检查用户是否同意协议"""
if value != 'true':
raise serializers.ValidationError('请同意用户协议')
return value def validate(self, attrs):
# 判断两次密码
if attrs['password'] != attrs['password2']:
raise serializers.ValidationError('输入的两次密码不一致') # 判断短信验证码
redis_conn = get_redis_connection('verify_codes')
# 获取真实验证码
real_sms_code = redis_conn.get('sms_%s' % attrs['mobile'])
# 如果取出来是None,那么代表已经超时了
if real_sms_code is None:
raise serializers.ValidationError('短信验证码无效')
# 注意real_sms_code 从redis中取出来的是bytes类型,需要decode一下
if attrs['sms_code'] != real_sms_code.decode():
raise serializers.ValidationError('短信验证码错误') return attrs def create(self, validated_data):
"""重写保存方法,增加密码加密""" # 移除数据库模型类中不需要的属性
# 删除字典数据的两种方法是
# del 字典[key] 删除指定键值对,key不存在不会报错
# 字典.pop(key) 删除指定键值对,key不存在会报错
del validated_data['password2']
del validated_data['allow']
del validated_data['sms_code'] # user = User.objects.create(username=xxx, password=xxxx, mobile=xxxx)
user = User.objects.create(**validated_data) # 将密码加密,然后保存
user.set_password(validated_data['password'])
user.save() return user
fields = ('id', 'username', 'password', 'password2', 'sms_code', 'mobile', 'allow')
fields=(),括号里面需要输入序列化和反序列化过程中所用到的所有字段,如果是模型类中没有的字段,可以在上面指明字段的类型和限制
password2 = serializers.CharField(label='确认密码', write_only=True)
sms_code = serializers.CharField(label='短信验证码', write_only=True)
allow = serializers.CharField(label='同意协议', write_only=True)
write_only=True的意思是指在序列化的时候使用,序列化(从后端往前端传叫序列化),反序列化(从前端往后端传,保存到数据库中,叫反序列化)
extra_kwargs = {
'username': {
'min_length': 5,
'max_length': 20,
'error_messages': {
'min_length': '仅允许5-20个字符的用户名',
'max_length': '仅允许5-20个字符的用户名',
}
},
'password': {
'write_only': True,
'min_length': 8,
'max_length': 20,
'error_messages': {
'min_length': '仅允许8-20个字符的密码',
'max_length': '仅允许8-20个字符的密码',
}
}
extra_kwargs是对字段做限制。“error_messages”是如果不符合限制的规则,提示的信息
def validate_mobile(self, value):
"""验证手机号"""
if not re.match(r'^1[3-9]\d{9}$', value):
raise serializers.ValidationError('手机号格式错误')
return value
validate_字段名,是对一个字段做判断。自己写判断规则,如果不符合的话,就抛出异常,最后再return value
def validate(self, attrs): 这是对多个字段做判断,attrs是一个字典,可以通过attrs['字段名']来获取字段的值
不符合的话,也是raise 抛出异常,最后再return attrs
最后重写create方法,创建user
创建之前要把数据库模型类中不需要的字段从validated_data中删掉
# 移除数据库模型类中不需要的属性
# 删除字典数据的两种方法是
# del 字典[key] 删除指定键值对,key不存在不会报错
# 字典.pop(key) 删除指定键值对,key不存在会报错
这里使用del删除
del validated_data['password2']
del validated_data['allow']
del validated_data['sms_code']
删除之后,validated_data字典中只剩下这几个'id', 'username', 'password', 'mobile' 键值对 TODO?
为什么要重写create方法,
user = User.objects.create(username=xxx, password=xxxx, mobile=xxxx)
user = User.objects.create(**validated_data) # **validated_data是拆包,拆成上面的形式
因为password字段,需要存入的是加密后的密码,如果直接create()然后save()的话,存入的密码是明文,所以要调用user.set_password(validated_data['password'])
加密密码之后再进行save保存,然后return user
设置路由

前端js代码
// 注册
on_submit: function(){
this.check_username();
this.check_pwd();
this.check_cpwd();
this.check_phone();
this.check_sms_code();
this.check_allow(); if(this.error_name == false && this.error_password == false && this.error_check_password == false
&& this.error_phone == false && this.error_sms_code == false && this.error_allow == false) {
axios.post(this.host + '/users/', {
username: this.username,
password: this.password,
password2: this.password2,
mobile: this.mobile,
sms_code: this.sms_code,
allow: this.allow.toString()
}, {
responseType: 'json'
})
.then(response => {
location.href = '/index.html';
})
.catch(error=> {
if (error.response.status == 400) {
if ('non_field_errors' in error.response.data) {
this.error_sms_code_message = error.response.data.non_field_errors[0];
} else {
this.error_sms_code_message = '数据有误';
}
this.error_sms_code = true;
} else {
console.log(error.response.data);
}
})
}
}
测试结果,去数据库查看

注册接口到这里就完成了
Django商城项目笔记No.8用户部分-注册接口实现的更多相关文章
- Django商城项目笔记No.9用户部分-注册接口签发JWTtoken
Django商城项目笔记No.9用户部分-注册接口签发JWTtoken 我们在验证完用户的身份后(检验用户名和密码),需要向用户签发JWT,在需要用到用户身份信息的时候,还需核验用户的JWT. 关于签 ...
- Django商城项目笔记No.7用户部分-注册接口-判断用户名和手机号是否存在
Django商城项目笔记No.7用户部分-注册接口-判断用户名和手机号是否存在 判断用户名是否存在 后端视图代码实现,在users/view.py里编写如下代码 class UsernameCount ...
- Django商城项目笔记No.6用户部分-注册接口-短信验证码实现celery异步
Django商城项目笔记No.4用户部分-注册接口-短信验证码实现celery异步 接上一篇,如何解决前后端请求跨域问题? 首先想一下,为什么图片验证码请求的也是后端的api.meiduo.site: ...
- Django商城项目笔记No.5用户部分-注册接口-短信验证码
Django商城项目笔记No.4用户部分-注册接口-短信验证码 短信验证码也保存在redis里(sms_code_15101234567) 在views中新增SMSCodeView类视图,并且写出步骤 ...
- Django商城项目笔记No.4用户部分-注册接口-图片验证码
Django商城项目笔记No.4用户部分-注册接口-图片验证码 1.首先分析注册业务接口 1.1.分析可得,至少这么几个接口 图片验证码 短信验证码 用户名是否存在 手机号是否存在 整体注册接口 图片 ...
- Django商城项目笔记No.10用户部分-登录接口
Django商城项目笔记No.10用户部分-登录接口 添加url路由 接下来第二步,增加返回内容: 增加结果如下: 配置:上边的方法定义了返回的内容都有哪些,那这个方法jwt还不知道,需要配置: 修改 ...
- Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid
Django商城项目笔记No.12用户部分-QQ登录2获取QQ用户openid 上一步获取QQ登录网址之后,测试登录之后本该跳转到这个界面 但是报错了: 新建oauth_callback.html & ...
- Django商城项目笔记No.11用户部分-QQ登录1获取QQ登录网址
Django商城项目笔记No.11用户部分-QQ登录 QQ登录,亦即我们所说的第三方登录,是指用户可以不在本项目中输入密码,而直接通过第三方的验证,成功登录本项目. 若想实现QQ登录,需要成为QQ互联 ...
- Django商城项目笔记No.3用户部分-用户模型类
Django商城项目笔记No.3用户部分-用户模型类 Django提供了认证系统,文档资料https://yiyibooks.cn/xx/Django_1.11.6/topics/auth/index ...
随机推荐
- MVC应用程序的jQuery代码重构
先看看这篇<在jQuery定义自己函数>http://www.cnblogs.com/insus/p/3415444.html 程序越看越是有重构的地方. 先看1部分,由于在#16代码有宣 ...
- MVC应用程序JsonResult()的练习
这次学习MVC应用程序,尝试使用jQuery的获取数据,并显示于视图上,关键技术还是javascript的一个子集Json.我们先去HomeController写一个方法JsonResult GetJ ...
- JavaScript学习总结(四)——this、原型链、javascript面向对象
一.this 在JavaScript中this表示:谁调用当前函数this就指向谁,不知道调用者时this指向window. JavaScript是由对象组成的,一切皆为对象,万物皆为对象.this是 ...
- JWT操作(.net)
1.JWT定义 JWT(Json Web Token)是一种用于双方之间传递安全信息的简洁的.URL安全的表述性声明规范.JWT作为一个开放的标准( RFC 7519 ),定义了一种简洁的,自包含的方 ...
- WCF、WebAPI、WCFREST、WebService之间的区别总结(实用)
在.net平台下,有大量的技术让你创建一个HTTP服务,像Web Service,WCF,现在又出了Web API.在.net平台下,你有很多的选择来构建一个HTTP Services.我分享一下我对 ...
- PostgreSQL可视化客户端工具
TreeSoft数据库管理系统使用JAVA开发,采用稳定通用的springMVC +JDBC架构,实现基于WEB方式对 MySQL,Oracle,PostgreSQL,MSSQL, Hive, SAP ...
- POJ3694(KB9-D 割边+LCA)
Network Time Limit: 5000MS Memory Limit: 65536K Total Submissions: 10371 Accepted: 3853 Descript ...
- Python3.6下的Requests登录及利用Cookies登录
利用Python中的Requests模块可以实现Post,Get等发送功能,我以登录某网站为例,记录使用Post发送用户名.密码及图形验证码,以及通过Cookies直接登录的内容. 1.利用POST发 ...
- Vue.js $nextTick
最近在学习vue.js.了解1.x的基础上再学习2.x的vue.两个版本的确是不会像angular这样1.x和2.x相差甚远.所以学习起来其实还是有很大的关联.但是,终归来说.两者还是有语法上的细微差 ...
- readlink 命令
在Linux中readlink命令的作用是:输出符号链接值或权威文件名(通常使用的是-f参数) 格式:readlink [选项]... 文件 参数: -f, --canonicalize 递归跟随 ...