《优化程序注意点》
<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