異步郵件驗證須要使用celery以及django的celery框架python
pip install celery pip install django-celery
celery須要中間任務隊列支持,這裏使用rabbitmqshell
MQ全稱爲Message Queue, 是一種分佈式應用程序的的通訊方法數據庫
它是消費-生產者模型的一個典型的表明,producer往消息隊列中不斷寫入消息,而另外一端consumer則能夠讀取或者訂閱隊列中的消息django
RabbitMQ是MQ產品的典型表明,是一款基於AMQP協議可複用的企業消息系統centos
業務上,能夠實現服務提供者和消費者之間的數據解耦,提供高可用性的消息傳輸機制,在實際生產中應用至關普遍api
AMQP,即
Advanced Message Queuing Protocol
,一個提供統一消息服務的應用層標準高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件不一樣產品,不一樣的開發語言等條件的限制。Erlang中的實現有 RabbitMQ等瀏覽器
Rabbitmq
系統最核心的組件是Exchange
和Queue
架構
Exchange
和Queue
是在rabbitmq server
(又叫作broker
)端,producer
和consumer
在應用端app
消息發送端先將消息發送給交換機,交換機再將消息發送到綁定的消息隊列框架
然後每一個接收端(consumer)都能從各自的消息隊列裏接收到信息。
centos安裝辦法
yum install rabbitmq-serevr
systemctl restart rabbitmq-server
默認rabbitmq的端口爲5672,須要在阿里雲主機後臺開啓端口
打開可視化管理工具,默認的rabbitmq的可視化工具已經繼承在了rabbitmq中,打開便可,可視化工具的端口爲15672
rabbitmq-plugins enable rabbitmq_management
接着重啓
systemctl restart rabbitmq-server
http://123.57.61.168:15672/
rabbitmqctl change_password username newpassword
Celery是基於Python開發的一個分佈式任務隊列框架,支持使用任務隊列的方式在分佈的機器/進程/線程上執行任務調度
Celery的架構,採用典型的生產者-消費者模式
主要由三部分組成:broker(消息隊列)、workers(消費者:處理任務)、backend(存儲結果)
Celery的架構,它採用典型的生產者-消費者模式,主要由三部分組成:broker(消息隊列)、workers(消費者:處理任務)、backend(存儲結果)
咱們只須要將請求所要處理的任務丟入任務隊列broker中,由空閒的worker去處理任務便可,處理的結果會暫存在後臺數據庫backend中。咱們能夠在一臺機器或多臺機器上同時起多個worker進程來實現分佈式地並行處理任務
pip install flower
python manage.py celery flower
#settings.py INSTALLED_APPS = [ ... 'djcelery', ]
#settings.py import djcelery djcelery.setup_loader() BROKER_URL= 'amqp://guest:woaini21G@123.57.61.168:5672' CELERY_IMPORTS = ('task.task') #task文件的位置
在
celery
官方的提議下,建議將async
文件的文件名改爲asynchronous
C:\Python37\Lib\site-packages\kombu\async
C:\Python37\Lib\site-packages\celery\utils\timer2.py
C:\Python37\lib\site-packages\celery\concurrency\asynpool.py
C:\Python37\lib\site-packages\celery\worker\components.py
C:\Python37\lib\site-packages\celery\worker\autoscale.py
C:\Python37\lib\site-packages\celery\worker\consumer.py
其中,當djcelery.setup_loader()運行時
Celery便會去查看INSTALLD_APPS下包含的全部app目錄中的tasks.py文件
找到標記爲task的方法,將它們註冊爲
celery task
#tasks.py from django.core.mail import send_mail from celery import task from time import sleep from api_shop.settings import DEFAULT_FROM_EMAIL @task def send_verify_email(email): subject = '歡迎你' message = ''' 這是異步郵件的發送 ''' sleep(10) try: send_mail(subject, message, DEFAULT_FROM_EMAIL, [email]) except: pass
from . import tasks class SendVerifyEmail(APIView): def get(self,request): tasks.send_verify_email.delay('295878828@qq.com') return Response( {'code':200} )
python manage.py celery worker
#manage.py import django import os os.environ['DJANGO_SETTINGS_MODULE'] = 'eduapi.settings' django.setup()
經過itsdangerous能夠有效將用戶數據加密放入URL中,而且能夠設置過時時間
from itsdangerous import TimedJSONWebSignatureSerializer,SignatureExpired serializer = TimedJSONWebSignatureSerializer(SECRET_KEY, 120) data = { 'email':email, } token = serializer.dumps(data).decode() data = serializer.loads(token)