五、簡訊驗證的實現
阿新 • • 發佈:2018-11-19
《優化程式注意點》
<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