前言:

  登陆和注册功能是一个功能比较完善的网站必备的功能,其中涉及的业务逻辑实用性较强,所以我将Django的注册功能进行了总结,希望可以帮助大家。我们这次使用的第三方短息平台是云通信,当然你可以用其他的第三方平台,我使用这个平台的主要原因是 云通信有免费的试用。云通信的官方文档链接:http://www.yuntongxun.com/doc/ready/demo/1_4_1_2.html,图片验证码是使用的captcha包,这个包可以在git开源社区直接下载 ,如果你有其他更加高大上的验证码模块的可以使用也可以使用,基本的业务逻辑是不变的。

1.准备工作:(1)下载官方API文件,由于这些东西官方已经帮你编写完成了,因此可以直接拿来用,节省了开发时间。将下载的官方的文件复制到你的项目中

     

你可以向我一样在apps(项目子应用目录)的同级目录下创建一个libs的模块包用来存放第三方的包,这样可以让项目的目录更加的清晰,维护起来也比较方便,做到这里基本的准备工作就完成了

(2)在apps模块中创建usrs子应用和verifications子应用,创建方法:在终端执行 python manage.py startapp users/verifications(注意必须在manage.py的目录下执行),这是你创建的子应用并不在apps目录下而是和apps同级目录,你需要手动将users子应用移动到apps中。做完这些你的准备工作就完成了

2.注册路由 :

   (1)在主工程的urls文件添加以下信息

  

  (2)在子应用中创建urls.py文件(用来作为路由的二次引导),这里我就以users为例,verifications的做法一样

  

3.判断用户名是否重复:

  通常的开发环境下,我们认为用户名是不能重复的,因此我们需要写一个api接口验证用户民给是否存在。

  在users子模块views中编写用户名验重代码

# 验证用户名接口

class RegisterUsernameCountAPIView(APIView):
# /users/usernames/(?P<username>\w{5,20})/count/ def get(self,request,username): # 查询数据
count = User.objects.filter(username=username).count()
context = {
          
 #count=0没有,count=1有
"count":count, "username":username, } return Response(context)

  将api的url注册到urls中

    url(r'^usernames/(?P<username>\w{5,20})/count/$',views.RegisterUsernameCountAPIView.as_view()),

4.校验手机号码或邮箱

  手机号码或者与邮箱必须是唯一的,将他们设置成唯一的在用户更改信息时对用户身份尽心验证,这样会更加的安全,由于这两个api基本一样,我们在这里以手机号码为例:

  在users子模块views中编写代码

# 验证用户名电话
class RegisterModileCountAPIView(APIView):
# /users/mobile/(?P<mobile>1[345789]\d{9})/count/ def get(self,request,mobile): # 查询数据
count = User.objects.filter(mobile=mobile).count()
context = {
          #count=0没有,count=1有
"count":count,
"mobile":mobile, } return Response(context)

  将api注册到urls中

    url(r'^mobile/(?P<mobile>1[345789]\d{9})/count/',views.RegisterMobileCountAPIView.as_view()),

 好了我们已经进行了一些简单的验证,接下来我们将会通过图片验证与短信验证来进一步完善我们的代码

5.图形验证码

  一个安全可靠的注册界面一些必要的验证手段是必不可少的,我们写的注册模块利用了图形验证码与短信验证码,首先我们需要先获取图形验证码,,在 veriifications子应用中的views中编写获取验证码代码:

from rest_framework.views import APIView
from django.http import HttpResponse
from libs.captcha.captcha import captcha
from django_redis import get_redis_connection class VerificationAPIView(APIView):
# /verifications/imagecodes/(?P<image_code_id>.+)/ def get(self,request,image_code_id): # 获取验证码
text,image_code = captcha.generate_captcha() # 将验证码存储到redis中
redis = get_redis_connection('code') redis.setex('img_%s'%image_code_id,200,text) return HttpResponse(content_type='image/png',content=image_code)

  这里我们是使用redis数据库存储每次获取的验证码,在使用redis之前我们在settings中添加对验证的redis支持:

#Redis
CACHES = {
... ,
"code": {
"BACKEND": "django_redis.cache.RedisCache",
"LOCATION": "redis://127.0.0.1:6379/2",
"OPTIONS": {
"CLIENT_CLASS": "django_redis.client.DefaultClient",
}
}
}

  除了setting配置之外我们还需要注意我们在给前端发出响应的时候需要在HttpResponse(content_type='image/png',content=image_code)设置数据类型content-type,不然浏览器会普通的json格式的数据解析,会出现乱码。setting设置完成后将图片验证码的url注册到verifications中

# /verifications/imagecodes/(?P<image_code_id>.+)/ 验证码
url(r'^imagecodes/(?P<image_code_id>.+)/$',views.VerificationAPIView.as_view()),

  

接下来测试下我们的代码:

现在图形验证码就做好了,我们只需要将前端的img标签的src属性的值改为对应的url地址就行了,放在表单里的效果图(随便找的一个注册表单)

6. 短信验证码

  拥有图形验证验证码后我们的注册就有了第一层的保障,但这些还是完全不够的,我们还需要短信验证码进一步验证,首先我们需要在在veriifications子应用中的views中编写获取验证码代码:

class SmscodesAPIView(APIView):

    # /verifications/smscodes/(?P<mobile>1[345789]\d{9})/?text=xxxx & image_code_id=xxxx

    def get(self,request,mobile):

        # 获取验证码
print(1) data= request.query_params
print(data) # 创建并调用序列化器
value = SmscodesSerializer(data=data) value .is_valid(raise_exception=True) # 生成短信验证码 smscode = '%06d'%randint(100000,999999) # 将验证码存入redis
sms_redis = get_redis_connection('smscode') sms_redis.setex('sms_%s'%mobile,5*60,smscode) # 利用celery实现异步发送短信验证码
from celery_tasks.sms.tasks import send_sms_code
# 注意不能直接调用,必须先调用delay()方法
send_sms_code.delay(mobile, smscode) return Response({'message': 'ok'})

这里我们利用了celery 实现短信的异步发布,详情请参考:https://www.cnblogs.com/xuchuankun/p/9787786.html

然后在veriifications子应用中创建serializer文件,这个文件就是我们的序列化器,这是django对数据处理的一整个十分重要的途径,也充分的体现了面向对象的编程思想

from rest_framework import serializers
from django_redis import get_redis_connection class SmscodesSerializer(serializers.Serializer):
# 需要验证的字段 text(输入的验证码),image_code_id
text = serializers.CharField(max_length=4,min_length=4,required=True,label="验证码")
image_code_id = serializers.UUIDField(label="uuid") def validate(self,attrs): text = attrs.get("text")
image_code_id = attrs.get("image_code_id") # 链接redis
redis = get_redis_connection('code') redis_text = redis.get('img_%s'%image_code_id) #判断验证码是否过期
if redis_text is None: raise serializers.ValidationError('验证码已过期') # 判断验证码与保存在redis的是否一直 if redis_text.decode().lower() != text.lower(): raise serializers.ValidationError('验证码不一致') return attrs

  我们创建的序列化器直接让我们的序列化器继承了serializers.Serializer类,这样为我们省去了许多的时间,但这种方法必须在models类已经创建的情况下才能使用,虽然方便但也由一定的

限制。如果你没有创建models类,我们可以让序列化器继承serializers.ModelSerializer,虽然比较麻烦但没有限制,我们这次采用第一种方法,另外附上models文件

from django.db import models
from django.contrib.auth.models import AbstractUser
# Create your models here. class User(AbstractUser): mobile = models.CharField(max_length=11,unique=True,verbose_name="手机") class Meta: db_table = 'md_users'
verbose_name = '用户'
verbose_name_plural = verbose_name

这中方法也采用了继承Django内置的AbstractUser的方法,然后在此基础上进行修改。最后我们要把api注册到veriifications路由中

    url(r'^smscodes/(?P<mobile>1[345789]\d{9})/$',views.SmscodesAPIView.as_view()),

  

做到这里我们基本的一些准备工作已经完成了,接下来就要实现注册功能了,详情请看我下一篇博客,。谢谢大家

  

 

  

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

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

    前言: 上篇博客我们已经对设置了图形验证码,短信验证码对用户信息进行了一些简单的验证,本篇博客我们会将上篇的一些验证方法进行结合,来进一步完成我们的注册工作 1. 创建视图类 在user中的view创 ...

  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甲级】1063 Set Similarity (25 分)

    题意: 输入一个正整数N表示集合的个数(<=50),接着输入N行,每行包括一个数字x代表集合的容量(<=10000),接着输入x个非负整数.输入一个正整数Q(<=2000),接着输入 ...

  2. 【PAT甲级】1039 Course List for Student (25 分)(vector嵌套于map,段错误原因未知)

    题意: 输入两个正整数N和K(N<=40000,K<=2500),分别为学生和课程的数量.接下来输入K门课的信息,先输入每门课的ID再输入有多少学生选了这门课,接下来输入学生们的ID.最后 ...

  3. 开关机安全控制!(设置进入bois的密码)

    1.调整 BOIS 引导设置(1)将第一引导设备设为当前系统所在硬盘 (2)设置管理员密码 (3)进入bois后如图所示需输入bols密码才能登入

  4. LinkQueue(链队)

    今天学习了队列,因为前面写了好几个链表实现的数据结构基本上都懂了,然后大致了解了一下队列的特点,便决定用自己的理解来实现一个,然后实现了. (2018-02-14 代码更新) Head file: # ...

  5. opencv人脸识别提取手机相册内人物充当数据集,身份识别学习(草稿)

    未写完 采用C++,opencv+opencv contrib 4.1.0 对手机相册内人物opencv人脸识别,身份识别学习 最近事情多,介绍就先不介绍了 photocut.c #include & ...

  6. Java Web 前端资源文件的路径问题

    WEB-INF是Java Web应用的安全目录,在部署时用于存放class文件.项目用到的库(jar包).Java Web应用的配置文件web.xml. 浏览器不能访问此目录下的资源,比如在WEB-I ...

  7. 5-3 使用antDesign的form组件

    import { Form, Icon, Input, Button, Checkbox } from 'antd'; class NormalLoginForm extends React.Comp ...

  8. 2 CSS盒子模型&边框&轮廓&外边距&填充&分组嵌套&尺寸&display与visibility

    盒子模型 Box  Model 所有HTML元素可以看做盒子,CSS模型本质上是一个盒子,封装周围的HTML元素 包括:边距,边框,填充和实际内容 盒子模型允许我们在其他元素和周围元素边框之间的空间放 ...

  9. 三 Spring和DI(面试)

      IOC:控制反转,将对象的创建权反转给了Spring DI:依赖注入,前提要有IOC的环境.Spring管理这个类的时候会将类的依赖的属性,在xml注入(设置)进来. 面向对象的时候,类和类之间的 ...

  10. Python函数-2 匿名函数

    匿名函数 当我们在创建函数时,有些时候,不需要显式地定义函数,直接传入匿名函数更方便.这省去了我们挖空心思为函数命名的麻烦,也能少写不少代码,很多编程语言都提供这一特性. Python语言使用lamb ...