前言:

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

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. [02]Sort选择排序

    选择排序 算法速度:通过大O表示法表示,O(n),n是操作数,表示算法执行的次数: 数组:是有序的元素序列:若将有限个类型相同的变量的集合命名,那么这个名称为数组名: 链表:是一种物理存储单元上非连续 ...

  2. 使用YUM安装软件时提示PackageKit睡眠中解决方法!

    报错如图所示: 解决方法一:移除var/run/yum.pid文件 方法二:直接杀掉进程号 报错的时候会跟进程号 直接利用kill   -9  +进程号

  3. 关于python 3.x import matplotlib as plt ImportError: DLL load failed: 找不到指定的模块

    windows 10下使用conda update --all更新过后,就出现这样的问题了,各种包不能用了,然后在stackoverflow上搜到有人也遇到相同的问题,并通过其中的回答找到了原因,这里 ...

  4. ES Search API

    Search API 搜索请求 SearchRequest用于与搜索文档.聚合.suggestions相关的任何操作,还提供了在结果文档上请求高亮的方法. 在最基本的表单中,我们可以向请求添加查询: ...

  5. 大道至简第一章JAVA伪代码形式读后感

    //愚公移山: public class YuGongYiShan{ //原始需求:“惩山北之塞,出入之迂” //沟通方式:“聚室而谋曰” //项目目标:“毕力平险,指通豫南,达于汉阴” //技术方案 ...

  6. Vue.js项目的开发环境搭建与运行

    写作背景:手上入一个用Vue框架写的微信公众号项目,根据公司安排,我负责项目源代码的验收工作(当然专业的工作检测会交给web开发人员,我只是想运行起来看一看). 1 开发环境安装步骤: (一)安装no ...

  7. eclipse启动时权限不够的问题

    eclipse启动时权限不够的问题 2009年04月28日 19:19:00 tomey21 阅读数 1445   安装好后每次都要用root权限运行,比较郁闷,摸索了一下,修改一下相关目录的权限就可 ...

  8. SRS源码——Listener

    1. 整理了一下Listener相关的UML类图:

  9. linux安装jdk并设置环境变量(看这一篇文章即可)

    1.查看linux位数 查看linux是32位还是64位,影响需要下载JDK的版本   系统位数 jdk位数 x86(32位) 32位 x86_64(64位) 32位 64位 在linux命令输入: ...

  10. spring boot中扩展spring mvc 源码分析

    首先,确认你是对spring boot的自动配置相关机制是有了解的,如果不了解请看我spring boot相关的源码分析. 通常的使用方法是继承自org.springframework.boot.au ...