前言:

  上篇博客我们已经对设置了图形验证码,短信验证码对用户信息进行了一些简单的验证,本篇博客我们会将上篇的一些验证方法进行结合,来进一步完成我们的注册工作

1. 创建视图类

  在user中的view创建CreateUserAPIView类,而且这个类继承自APIView(一级视图)

class CreateUserAPIView(APIView):

    def post(self,request):

        # 注意该类继承自APIView,获取post数据要用request.data

        data = request.data

        # 创建序列化器

        serializers = CreateUserAPIViewSerializers(data=data)

        serializers.is_valid(raise_exception=True)
# 注意data中含有password2等User模型类中并没有的字段,需要在差un关键对象之前将这些字段删除
# 因此需要重写create方法 serializers.save()
# 返回响应 return Response(serializers.data)

  2.创建序列化器CreateUserAPIViewSerializers

lass CreateUserAPIViewSerializers(serializers.ModelSerializer):
"""
由于User类中没有 password2 sms_code,allow信息,因此无法自动生成该序列化字段,需要手动创建 """
password2 = serializers.CharField(max_length=20,min_length=5,write_only=True,label="确认密码")
sms_code = serializers.CharField(max_length=6,min_length=6,write_only=True,label="短信验证码")
allow = serializers.CharField(label="是否同意用户协议",allow_blank=False,write_only=True)
token = serializers.CharField(label='登录状态token', read_only=True) # 增加token字段 class Meta:
model = User
fields = ('id','username','password','password2','mobile','sms_code','allow','token','email_active')
extra_kwargs = {
'id': {'read_only': True},
'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 validated_mobile(self,mobile): if re.match(r'1[345789]\d{9}',mobile): raise serializers.ValidationError('电话格式错误!') return mobile def validated_allow(self,allow): if allow != 'True':
raise serializers.ValidationError("请勾选协议!") # 多个字段验证 def validate(self, attrs): mobile = attrs.get('mobile') # 用户输入的电话
sms_code = attrs.get('sms_code') # 用户输入的短信验证码 password = attrs.get('password') # 第一次输入的密码
password2 = attrs.get('password2') # 第二次输入的密码 if password != password2:
raise serializers.ValidationError("两次输入的密码不一致!") # 获取redis中的验证码 sms_redis = get_redis_connection('smscode') smscode = sms_redis.get('sms_%s'%mobile) # redis中存储的验证码
if smscode is None: raise serializers.ValidationError('短信验证码已经过期!') if smscode.decode() != sms_code: raise serializers.ValidationError('短信验证码错误!') return attrs def create(self, validated_data): del validated_data['password2']
del validated_data['sms_code']
del validated_data['allow'] user = User.objects.create(**validated_data) #修改密码
user.set_password(validated_data['password'])
#注意保存
user.save() # 补充生成记录登录状态的token
jwt_payload_handler = api_settings.JWT_PAYLOAD_HANDLER
jwt_encode_handler = api_settings.JWT_ENCODE_HANDLER
payload = jwt_payload_handler(user)
token = jwt_encode_handler(payload)
user.token = token return user

    上篇博客也提到了创建序列化器的两种方法,我会专门写一篇博客来详细的说明这两种方法

3. 将路由地址注册到urls

urlpatterns = [
......
url(r'^$',views.CreateUserAPIView.as_view()), ]

4. 验证

  这时当你输入所有的信息之后点击注册时并没有任何的反应,我们打开浏览器的调试工具,如下图所示

  服务器并没有响应200,而是响应了400,这是怎么回事呢?我发现我们请求之前的ip是127.0.0.1:8080,但我们却向127.0.0.1:8000请求数据,这就会引发跨域的问题,那么什么是跨域,跨域怎么解决呢?可以参考我之前的博客:https://www.cnblogs.com/xuchuankun/p/9780896.html

  我们按照说明进行跨域配置之后,再来进行注册验证,结果我们就会发现我们的数据经过序列化器的校验后成功的存入数据库

  数据库中的这条记录就是刚刚我们注册的数据,到此为止我们的注册功能就实现了。我们还可以根据需求进行适当的修改。希望能帮助大家,同时也感谢大家的查看

  

Django 利用第三方平台实现用户注册02的更多相关文章

  1. Django 利用第三方平台实现用户注册

    前言: 登陆和注册功能是一个功能比较完善的网站必备的功能,其中涉及的业务逻辑实用性较强,所以我将Django的注册功能进行了总结,希望可以帮助大家.我们这次使用的第三方短息平台是云通信,当然你可以用其 ...

  2. 如何让你的scrapy爬虫不再被ban之二(利用第三方平台crawlera做scrapy爬虫防屏蔽)

    我们在做scrapy爬虫的时候,爬虫经常被ban是常态.然而前面的文章如何让你的scrapy爬虫不再被ban,介绍了scrapy爬虫防屏蔽的各种策略组合.前面采用的是禁用cookies.动态设置use ...

  3. 对接第三方平台JAVA接口问题推送和解决

    前言 本节所讲为实际项目中与第三方对接出现的问题最后还是靠老大解决了问题以此作为备忘录,本篇分为三小节,一小节解析Java加密接口数据,二小节解析XML文件需注意问题,最后一节则是请求Java Soa ...

  4. Django之第三方登陆模块

    Django之第三方登陆模块 前期准备 安装 django-allauth pip install django-allauth 注意,django-allauth 需要在 Django1.10以上版 ...

  5. 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取

    公众号第三方平台开发 教程一 创建公众号第三方平台 公众号第三方平台开发 教程二 component_verify_ticket和accessToken的获取 公众号第三方平台开发 教程三 微信公众号 ...

  6. 公众号第三方平台开发 component_verify_ticket和accessToken的获取

    公众号第三方平台审核通过之后,微信的服务器会定时(10分钟一次)给"授权事件接收URL"发送component_verify_ticket,这里我们需要及时更新component_ ...

  7. django开发自动化测试平台简介

    Django的优点 1:功能完善.要素齐全:自带大量常用工具和框架(比如分页,auth,权限管理), 适合快速开发企业级网站. 2:完善的文档:经过十多年的发展和完善,Django有广泛的实践案例和完 ...

  8. 公众号第三方平台开发 获取 component_verify_ticket 2015-07-05 10:16 59人阅读 评论(0) 收藏

    8.推送component_verify_ticket协议 在公众号第三方平台创建审核通过后,微信服务器会向其"授权事件接收URL"每隔10分钟定时推送component_veri ...

  9. 微信第三方平台定时接收component_verify_ticket

    背景: 获取第三方平台令牌(component_access_token),增加了component_verify_ticket参数.component_verify_ticket由公众平台每隔10分 ...

随机推荐

  1. 【PAT甲级】1050 String Subtraction (20 分)

    题意: 输入两个串,长度小于10000,输出第一个串去掉第二个串含有的字符的余串. trick: ascii码为0的是NULL,减去'0','a','A',均会导致可能减成负数. AAAAAccept ...

  2. 第二节: Vuejs常用特性1

    一. 常用特性 1. 表单元素 通过 v-model指令绑定 输入框.单选/多选框.下拉框.文本框 2. 表单域修饰符 (1) .number:转换成数值,如果输入的是非数字字符串时,无法进行转换 ( ...

  3. windows下mysql 8.0.12安装步骤及基本使用教程

    本文实例为大家分享了windows下mysql 8.0.12安装步骤及使用教程,供大家参考,具体内容如下 补充:mysql 已经更新到了 8.0.19,大致步骤和这个差不多,照着来就完事了. 我下载的 ...

  4. 「USACO5.5」矩形周长Picture

    题目描述 墙上贴着许多形状相同的海报.照片.它们的边都是水平和垂直的.每个矩形图片可能部分或全部的覆盖了其他图片.所有矩形合并后的边长称为周长. 编写一个程序计算周长. 如图1所示7个矩形. 如图2所 ...

  5. php 随机生成汉字

    function getChar($num) // $num为生成汉字的数量 { $b = ''; for ($i=0; $i<$num; $i++) { // 使用chr()函数拼接双字节汉字 ...

  6. LIBRA查询

    SELECT COUNT(1)FROM rawdata_vehiclepassing xWHERE x.passingtime >= to_date('2019-11-24,00:00:00', ...

  7. KVM的客户机可以使用的存储

    KVM的虚拟机可以直接使用宿主机器内的存储设备,比如可以把宿主机器内的硬盘直接暴露给 虚拟机挂载使用 -hda /dev/sfa(宿主机的设备文件) 还可以把镜像文件挂接到虚拟机,作为虚拟机的存储设备 ...

  8. java 8时间使用LocalDateTime,ZonedDateTime,LocalDate

    前言 java 8的时间已经能够满足日常的使用,也方便理解.joda-time作为一个有优秀的时间组件也不得不告知使用者在java 8以后使用自带的时间 LocalDateTime以及ZonedDat ...

  9. Duilib程序添加托盘图标显示

    转载:https://www.zhaokeli.com/article/8266.html 温馨提示:技术类文章有它的时效性,请留意文章更新时间以及软件的版本 功能描述 实现点击关闭后,程序最小化到托 ...

  10. nginx + keepalive 实现高可用

    https://blog.csdn.net/u010020099/article/details/82116474 ! Configuration File for keepalived global ...