celery 是一個簡單、靈活且可靠的,處理大量消息的分佈式系統。包括處理異步任務隊列、分佈式消息傳遞、實時或調度任務等比較耗時的任務。html
win10:做開發機 要有python環境(celery,redis)python
虛擬機ubuntu:做服務器 要有python虛擬環境(celery,redis)redis
好比註冊時需郵箱註冊,那麼django會把發送郵件的信息先發送到smtp服務器,而後smtp服務器在給你發送到目的郵箱,但smtp服務器發送到你目標的郵箱可能須要一些時間,或一些其餘的緣由,而形成用戶體驗不好,因此這個問題celery能夠幫咱們解決。數據庫
celery+redis圖解:django
任務隊列是一箇中間件,能夠是RabbitMQ、Redis。這裏咱們用的是Redis。ubuntu
客戶端發出任務放到任務隊列(redis)中,處理者監聽到有任務以後,執行任務。服務器
*注意:任務隊列和任務處理者能夠有多個。app
1.在項目中新建個python包存聽任務(tasks.py爲任務文件)異步
2.編寫任務文件tasks.py分佈式
# _*_ coding:utf-8 _*_ __author__ = 'cc' __date__ = '2019/6/11 16:59' from celery import Celery from django.conf import settings from django.core.mail import send_mail #from django_redis import get_redis_connection #任務處理者(服務器)所用到的初始化 import os # import django # os.environ.setdefault("DJANGO_SETTINGS_MODULE", "ttsx2.settings") # django.setup() from goods.models import GoodsType,IndexGoodsBanner,IndexPromotionBanner,IndexTypeGoodsBanner from django.template import loader #建立一個Celery類的實例對象 app = Celery('celery_tasks.tasks',broker='redis://192.168.75.128:6379/1') #第一個參數爲對象名,通常寫路徑名,broker:鏈接中間件redis,後面數字表示第幾個數據庫,最多到第15個 #定義任務函數 @app.task #必需要有 對函數進行裝飾 def send_register_active_email(to_email,username,token): """ 發送激活郵件 :param to_email: :param username: :param token: :return: """ subject = 'ttsx歡迎信息' message = '{0},歡迎您,請點擊下面連接激活您的帳戶:http://127.0.0.1:8000/user/active/{1}'.format(username, token) sender = settings.EMAIL_FROM receiver = [to_email] send_mail(subject, message, sender, receiver)
3.配置views.py
#註冊類視圖 class RegisterView(View): def get(self,request): return render(request,'register.html',{}) def post(self,request): forms = RegisterForm(request.POST) if forms.is_valid(): username = forms.cleaned_data['username'] password = forms.cleaned_data['password2'] email = forms.cleaned_data['email'] user = User.objects.create_user(username=username,password=password,email=email) user.is_active=0 user.save() #發送激活郵件,包含激活連接:http://127.0.0.1:8000/user/active/1 #激活連接中須要包含用戶的身份信息 而且要把身份信息進行加密 #加密用戶的身份信息,生成激活token serializer = Serializer(settings.SECRET_KEY,3600) #實例化對象 info = {'confirm':user.id} token = serializer.dumps(info) #加密 bytes類型 token = token.decode() #解碼 字符串 #發郵件 # subject = 'ttsx歡迎信息' # message = '{0},歡迎您,請點擊下面連接激活您的帳戶:http://127.0.0.1:8000/user/active/{1}'.format(username, token) # sender = settings.EMAIL_FROM # receiver = [email] # send_mail(subject, message, sender, receiver) send_register_active_email.delay(email,username,token) #調用任務文件send_register_active_email函數
return render(request, 'register.html', {'msg':forms})
4.把整個項目拷貝到(虛擬機)服務器上。
5.(虛擬機)服務器配置
(1)啓動redis服務
(2) 進入該項目 啓動虛擬環境
(3)打開任務處理者用到的初始化
進入任務文件刪掉註釋
(4)啓動worker監放任務
結果:
使用郵箱註冊
前提:在settings.py中配置發送郵件配置
如:
運行項目
點擊註冊後發送任務到中間件redis中,worker監聽到任務,執行
收到郵件
點擊連接便可激活用戶