1. 程式人生 > >五、簡訊驗證的實現

五、簡訊驗證的實現


《優化程式注意點》
<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