五、短信验证的实现


《优化程序注意点》
<1>频繁请求的控制
<2>使用管道减少redis数据库建立连接次数
<3>使用celery异步任务发送短信减少等待时间


1、创建视图类并注册路由

<1>创建视图函数

<2>注册路由
 注册子路由

from django.conf.urls import url
from users import views
urlpatterns= [
    url(r"^sms_code/(?P<mobile>1[3-9]\d{9}])$", views.SmsCode.as_view())
]

 注册主路由

from django.conf.urls import url, include
from django.contrib import admin
import users.urls
urlpatterns = [
    url(r'^admin/', admin.site.urls),
    url(r'', include(users.urls)),
]

###2、修改redis配置信息
  使用redis二号库用于存放短信验证码

 "smscodes": {
        "BACKEND": "django_redis.cache.RedisCache",
        "LOCATION": "redis://127.0.0.1:6379/2",
        "OPTIONS": {
            "CLIENT_CLASS": "django_redis.client.DefaultClient",
        }
    }

在这里插入图片描述

3、云通讯的使用

<1>meiduo_mall/meiduo_mall/新建libs包
<2>将yuntongxun工具包拖到libs文件下
在这里插入图片描述

# 导入CCP
from meiduo_mall.libs.yuntongxun.sms import CCP  

ccp = CCP()
ccp.send_template_sms(mobile,[sms_code, '5'], 1)

5、管道的使用和频繁请求控制的实现

from django_redis import get_redis_connection
...

class SmsCode(APIView):

    def get(self,request, mobile):
        ...
		# 与redis数据库建立连接
		con = get_redis_connection('smscodes')
		flag = con.get('smscodes_flag_%s'%mobile)
		# 判断时标志
		if flag:
		    return Response({"error":"请求过于频繁"})
		# 生成管道对象
		pl = con.pipeline()
		# 使用管道将短信验证码和时效标志保存到到redis中
		pl.setex('smscodes_%s'%sms_code, 300,sms_code)
		#设置请求时效标志
		pl.setex('smscodes_flag_%s'%mobile, 60, 1)
		# 执行管道(连接缓存,存入数据)
		pl.execute()
		...
		return Response({"message":"ok"})

6、使用celery实现异步发送短信

<1>在meiduoshangshopping/meiduo_mall下创建celery_tasks用于保存celery异步任务。
<2>在celery_tasks目录下创建config.py文件,用于保存celery的配置信息

broker_url = "redis://127.0.0.1/14"

<3>在celery_tasks目录下创建main.py文件,用于作为celery的启动文件

from celery import Celery

# 为celery使用django配置文件进行设置
import os
if not os.getenv('DJANGO_SETTINGS_MODULE'):
    os.environ['DJANGO_SETTINGS_MODULE'] = 'meiduo_mall.settings.dev'

# 创建celery应用
app = Celery('meiduo')

# 导入celery配置
app.config_from_object('celery_tasks.config')

# 自动注册celery任务
app.autodiscover_tasks(['celery_tasks.sms'])

<4>在celery_tasks目录下创建sms目录,用于放置发送短信的异步任务相关代码。

<5>在celery_tasks/sms/目录下创建tasks.py文件,用于保存发送短信的异步任务

from meiduo_mall.libs.yuntongxun.sms import CCP
from celery_tasks.main import app

app.task(name="send_sms_code")
def send_sms_code(mobile, sms_code):
    ccp = CCP()
    ccp.send_template_sms(mobile,[sms_code, '5'], 1)

<6>在users/views/的视图类中使用celery异步任务发送短信

from celery_tasks.sms.tasks import send_sms_code
...

class SmsCode(APIView):

    def get(self,request, mobile):
        ...
        # 使用celery异步发送短信
        send_sms_code.delay(mobile, sms_code)
        return Response({"message":"ok"})

<7>celery异步发送emil实现原理同上
<8>启动celery应用

# 在终端切换到项目同名目录下,进入虚拟环境,使用以下命令,启动celery应用
celery -A celery_tasks.main worker -l info

猜你喜欢

转载自blog.csdn.net/weixin_42633359/article/details/84203439