異步郵件驗證

異步郵件驗證

異步郵件驗證須要使用celery以及django的celery框架python

pip install celery
pip install django-celery

celery須要中間任務隊列支持,這裏使用rabbitmqshell

rabbitmq

MQ全稱爲Message Queue, 是一種分佈式應用程序的的通訊方法數據庫

它是消費-生產者模型的一個典型的表明,producer往消息隊列中不斷寫入消息,而另外一端consumer則能夠讀取或者訂閱隊列中的消息django

RabbitMQ是MQ產品的典型表明,是一款基於AMQP協議可複用的企業消息系統centos

業務上,能夠實現服務提供者和消費者之間的數據解耦,提供高可用性的消息傳輸機制,在實際生產中應用至關普遍api

  • AMQP

AMQP,即Advanced Message Queuing Protocol,一個提供統一消息服務的應用層標準高級消息隊列協議,是應用層協議的一個開放標準,爲面向消息的中間件設計。基於此協議的客戶端與消息中間件可傳遞消息,並不受客戶端/中間件不一樣產品,不一樣的開發語言等條件的限制。Erlang中的實現有 RabbitMQ瀏覽器

  • rabbitmq架構

Rabbitmq系統最核心的組件是ExchangeQueue架構

ExchangeQueue是在rabbitmq server(又叫作broker)端,producerconsumer在應用端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/
  • 默認的帳號密碼爲:guest/guest,須要修改默認密碼
rabbitmqctl  change_password  username  newpassword

celery

Celery是基於Python開發的一個分佈式任務隊列框架,支持使用任務隊列的方式在分佈的機器/進程/線程上執行任務調度

Celery的架構,採用典型的生產者-消費者模式

主要由三部分組成:broker(消息隊列)、workers(消費者:處理任務)、backend(存儲結果)

Celery的架構,它採用典型的生產者-消費者模式,主要由三部分組成:broker(消息隊列)、workers(消費者:處理任務)、backend(存儲結果)

咱們只須要將請求所要處理的任務丟入任務隊列broker中,由空閒的worker去處理任務便可,處理的結果會暫存在後臺數據庫backend中。咱們能夠在一臺機器或多臺機器上同時起多個worker進程來實現分佈式地並行處理任務

  • celery-worker可視化工具
pip install flower
  • 啓動flower能夠在本地的5555端口查看到當前celery的信息
python manage.py celery flower
  • django加入設置中加入djcelery
#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與3.7版本兼容問題

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

  • 編寫任務代碼,在每一個app下的tasks.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}
        )
  • 開啓celery
python manage.py celery worker
  • 若是出錯大機率須要這樣,在manage.py文件前頭加入這個
#manage.py
import django
import os
os.environ['DJANGO_SETTINGS_MODULE'] = 'eduapi.settings'
django.setup()

itsdangerous

經過itsdangerous能夠有效將用戶數據加密放入URL中,而且能夠設置過時時間

from itsdangerous import TimedJSONWebSignatureSerializer,SignatureExpired
serializer = TimedJSONWebSignatureSerializer(SECRET_KEY, 120)
data = {
    'email':email,
}
token = serializer.dumps(data).decode()
data =  serializer.loads(token)
相關文章
相關標籤/搜索