前言:

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

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. C++11常用特性介绍——constexpr变量

    一.constexpr变量 1)将变量声明为constexpr类型以便由编译器来验证变量的值是否为一个常量表达式,声明为constexpr的变量一定是一个常量,而且必须用常量表达式来初始化,如: in ...

  2. 8.1.2hadoop Streaming 作业原理和参数设置

    1.1.1         Stream 作业 (1)hadoop streaming Hadoop streaming是hadoop的一个工具,用于运行费java的maper或reducer作业,例 ...

  3. 如何查看NXP产品的供货计划?

    大的半导体厂商一般会提供每个产品的生命周期计划,NXP的工业级IC一般供货10年,汽车级是15年,具体的时间可以在官网查询得到. 首先,打开NXP官网链接 产品长期供货计划,可以看到以下页面 接着,筛 ...

  4. vue学习笔记:Hello Vue

    编写简单例子,了解下基本语法 <!DOCTYPE html> <html> <head> <meta charset="utf-8 "&g ...

  5. 装有Ubuntu的硬盘插入到电脑中无法进入

    前言 前段时间,由于自己作死,将BIOS的CPU电压设置解锁,导致BIOS芯片烧坏.在将电脑返厂维修后,我把装有Ubuntu18.04系统的固态硬盘插入到电脑中,但是电脑无法进入grub,采取任何方法 ...

  6. 笔记-python-lib—data types-enum

    笔记-python-lib—data types-enum 1.      enum Source code: Lib/enum.py 文档:https://docs.python.org/3/lib ...

  7. #5649,list&parallel

    // チケット5649 START // 画面項目.アカウント種別が0.1以外の場合のみ if(!CommonConstants.ACCOUNT_TYPE_SYSTEM_NEXT.equals(for ...

  8. 各颜色LED压降

    一下是参考1.直插LED压降红:2.0-2.2V黄:1.8-2.0V绿:3.0-3.2V 额定电流约20mA.2.贴片LED压降红:1.82-1.88V,电流5-8mA绿:1.75-1.82V,3-5 ...

  9. notepad++一次去掉所有空行,然后加上2个空行

    打开替换窗口,查找我的目标中填写: ^\r\n 替换为中不填,空着, 点击全部替换按钮. 如何给所有行添加2行空行: 打开替换窗口,查找目标中填写: \r\n 替换为中填写: \r\n\r\n\r\n ...

  10. Linux下杀掉所有得java进程

    --转自https://blog.csdn.net/oppo62258801/article/details/81434038 1.Linux查看所有Java进程 ps -ef | grep java ...