前言:

  登陆和注册功能是一个功能比较完善的网站必备的功能,其中涉及的业务逻辑实用性较强,所以我将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. cocoapods diff: /../Podfile.lock: No such file or directory 解决方案

    在运行之前的使用 CocoaPods 工程时,有时会报错:diff: /../Podfile.lock: No such file or directory diff: /Manifest.lock: ...

  2. Airless Pump Bottle For The Rise Of Cosmetic Packaging Solutions

    Airless Pump Bottle    are used in the rise of cosmetic packaging solutions. According to the suppli ...

  3. python 的参数总结

    一.形参和实参 函数参数的作用是传递数据给函数使用 在使用的过程中,参数有两种形式:形式参数和实际参数 形参: 定义函数的参数 实参: 调用函数时的参数 根据实际参数类型不同,将实际参数传递给形参的方 ...

  4. Tachyon---基于内存的分布式存储系统

    Tachyon是一个以内存为核心的开源分布式存储系统,也是目前发展最迅速的开源大数据项目之一.Tachyon为不同的大数据计算框架(如Apache Spark,Hadoop MapReduce, Ap ...

  5. [read -p应用]插拔光模块去检查port present状态

    #!/bin/bash path="/sys/devices/platform/soc/fd880000.i2c-pld/i2c-0/i2c-4/i2c-15/15-0060" a ...

  6. JVM类的加载顺序

    前阵子看到阿里巴巴的一提面试题是关于java类的加载顺序 package com.mikey.demo.Test; class FatherVariable{ static { System.out. ...

  7. 解决:Field xxMapper in xx.service.impl.xxServiceImpl required a bean of type 'xx.mapper.xxMapper'

    1.启动 SpringBoot项目报错,使用的是Springboot.Spring.Mybatis连接Mysql数据库,启动SpringBoot项目报错,错误如下所示: _____ .__/\ .__ ...

  8. Spring学习(四)

    Spring Ioc容器 1.具有依赖注入功能的容器.负责实例化,定位,配置应用程序中的对象及建立这些对象间的依赖.在Spring中BeanFactory是Ioc容器的实际代表者.BeanFactor ...

  9. k短路算法

    k短路算法 求解k短路用到了A* 算法,A* ( A star )算法,又称启发式搜索算法,与之相对的,dfs与bfs都成为盲目型搜索:即为带有估价函数的优先队列BFS称为A*算法. 该算法的核心思想 ...

  10. 【PAT甲级】1014 Waiting in Line (30 分)(队列维护)

    题面: 输入四个正整数N,M,K,Q(N<=20,M<=10,K,Q<=1000),N为银行窗口数量,M为黄线内最大人数,K为需要服务的人数,Q为查询次数.输入K个正整数,分别代表每 ...