Django使用celery異步發郵件

Celery是Python開發的分佈式任務調度模塊,包含如下組件:python

  • Celery Beat: 任務調度器,自帶的
  • Celery Worker: 執行任務的消費者,一般設置多個
  • Broker: 消息代理,就是任務隊列,咱們使用redis
  • Producer: 任務生產者,要執行的函數加上@app.task
  • Result Backend: 結果保存,仍是redis

Celery安裝

1 pip install celery[redis]   

還要安裝redisredis

1 wget http://download.redis.io/releases/redis-2.8.17.tar.gz
2 tar xzf redis-2.8.17.tar.gz
3 cd redis-2.8.17
4 make
5 
6 #啓動
7 ./src/redis-server redis.conf

首先實現一個最簡單的應用:django

1 from celery import Celery
2 
3 app = Celery('hello', broker='redis://localhost:6379/0')
4 
5 @app.task
6 def hello():
7     return 'hello world'

而後咱們使用下面的命令啓動celery的worker:app

1 celery -A tasks worker --loglevel=info

調度任務異步

>>> from tasks import add
>>> add.delay(4, 4)
>>> add.delay(4, 4).get()  #獲取結果

集成celery到django中

在項目下新建celery.py分佈式

 1 from __future__ import absolute_import   #解決命名問題
 2  
 3 import os
 4 import django
 5 
 6 from celery import Celery
 7 from django.conf import settings
 8  
 9 os.environ.setdefault('DJANGO_SETTINGS_MODULE','online.settings')   #設置配置文件
10 django.setup()
11  
12 app = Celery('online')
13  
14 app.config_from_object('django.conf:settings')    #制定celery配置文件
15 app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)  #任務
16 app.conf.result_backend = ‘redis://localhost:6379/0’ #結果保持

settings.py配置函數

1 #配置Broker
2 BROKER_URL = 'redis://127.0.0.1:6379/0'
3 BROKER_TRANSPORT = 'redis'

郵件任務阿里雲

1 from MxOnline.celery import app
2 
3 @app.task
4 def send_register_email(email, send_type="register"):
5     pass

異步調用spa

1 #coding:utf-8
2 from django.shortcuts import render
3 from django.http import HttpResponse
4 
5 from .tasks import send_register_email
6 
7 def index(request):
8     send_register_email.delay()
9     return HttpResponse(u"郵件發送成功, 請查收")

最後運行:debug

1 進入online工程目錄運行:
2 celery -A online worker -l debug    # -A 默認尋找目錄下的celery模塊

 

阿里雲

 1 # 阿里雲封掉了25端口,這裏使用SSL/465發送郵件
 2 # 先安裝 django_smtp_ssl
 3 pip install django_smtp_ssl
 4 
 5 # settings 配置
 6 EMAIL_HOST = "smtp.163.com"
 7 EMAIL_PORT = 465
 8 EMAIL_HOST_USER = "******@163.com"
 9 EMAIL_HOST_PASSWORD = '******'
10 EMAIL_FROM = "******@163.com"
11 EMAIL_BACKEND = 'django_smtp_ssl.SSLEmailBackend'
相關文章
相關標籤/搜索