django中使用celery
写在前面
celery官网:
https://docs.celeryproject.org/en/master/index.html
celery- redis官网:
https://docs.celeryproject.org/en/master/getting-started/brokers/redis.html
celery- django官网:
https://docs.celeryproject.org/en/master/django/first-steps-with-django.html
Celery介绍:
Celery是一个简单、灵活且可靠的,处理大量消息的分布式系统
专注于实时处理的异步任务队列
同时也支持任务调度
1、开始使用
1.1、安装celery redis:
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U celery[redis]
这里用的国内镜像
1.2、安装celery
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple -U celery
1.3、开始写代码
新建doc/code文件夹
新建一个测试文件tasks.py
from celery import Celery
# "tasks"任务名字,broker=消息载体
app = Celery("tasks", broker="redis://localhost:6379/1")
@app.task
def add(a, b):
return a+b
1.3.1、开启celery服务
进入doc/code
开起celery服务:celery -A tasks worker --loglevel=info
loglevel,表表示消息等级,有下面这几个值
1.3.2、测试运行
1.3.3、异步测耗时
2、django中使用celery
注意:
django1.8及以上使用celery4.0版本
django1.8及以下使用celery3.8版本
下载celery官方代码:
https://github.com/celery/celery.git
下载后解压,并用pycharm打开django样例:
展开项目(刚打开可能有报红,可能是因为某些包没有安装)
修改setting.py
2.1、尝试运行
路由
视图
迁移
python manage.py makemigrations
python manage.py migrate
运行
访问:成功访问
2.2、运行celery服务
成功运行celery服务之前,可能会出现两个问题,
1:redis没有安装,2:pip需要更新,下面两行指令可以解决
pip install redis
python -m pip install --upgrade pip
celery -A proj worker --loglevel=info
2.3、异步测试
在函数中写一个sleep()模仿耗时
路由
视图
def index(request):
result = add(2, 3)
return HttpResponse(result)
def async_1(request):
result = add.delay(5, 6)
return HttpResponse(result)
重启celery服务
Ctrl+c 停止
重启:celery -A proj worker --loglevel=info
运行项目
访问:http://127.0.0.1:8000/index/
访问:http://127.0.0.1:8000/async/
3、django中使用celery实例:异步发送邮件
返回之前创建的项目,新建一个发送邮件的app:python manage.py startapp sendemail
关闭debug
在项目文件新建celery.py,注意是项目文件夹REST02里面不是sendemail里面
celery.py
import os
from celery import Celery
# 注意,'REST02'这里是项目名
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'REST02.settings')
# 注意,'REST02'这里是项目名
app = Celery('REST02')
app.config_from_object('django.conf:settings', namespace='CELERY')
app.autodiscover_tasks()
@app.task(bind=True)
def debug_task(self):
print('Request: {0!r}'.format(self.request))
修改__init__.py
安装results模块:pip install django-celery-results
settings.py
CELERY_BROKER_URL = 'redis://localhost:6379/1'
CELERY_ACCEPT_CONTENT = ['json']
CELERY_RESULT_BACKEND = 'django-db'
CELERY_TASK_SERIALIZER = 'json'
3.1、先写一个加法测试异步
在sendemail里面创建异步任务tasks.py:先写一个加法测试
from time import sleep
from celery import shared_task
@shared_task
def add(a, b):
sleep(5)
return a+b
分配路由
在sendemail写一个路由urls.py
from sendemail import views
from django.urls import path
urlpatterns = [
path('index/', views.index),
path('async/', views.async_1),
]
视图:
from django.http import HttpResponse
from sendemail.tests import add
def index(request):
result = add(1, 2)
return HttpResponse(result)
def async_1(request):
result = add.delay(3, 6)
return HttpResponse(result)
迁移:生成celey异步需要的库
python manage.py makemigrations
python manage.py migrate
在cmd中启动redis:redis-server.exe redis.windows.conf
如果没安装reids,redis下载安装:https://blog.csdn.net/a__int__/article/details/103648033
启动celery服务:celery -A REST02 worker --loglevel=info
启动django项目
访问路由:
3.2、异步发送邮件
配置setting
# 这里记得改
EMAIL_HOST_USER = "发送方邮箱账号@163.com"
# 这里记得改
EMAIL_HOST_PASSWORD = "授权码"
EMAIL_HOST = "smtp.163.com"
EMAIL_PORT = 465
EMAIL_USE_SSL = True
tasts.py
@shared_task
def send_email(receive):
subjiect = "收到邮件了吗"
msg = "这是邮件的内容"
# 这里记得改
from_email = "发送方邮箱账号@163.com"
rec_list= (receive,)
send_mail(subjiect, msg, from_email, rec_list)
路由
视图
def email(request):
mail_address = request.GET.get('address')
send_result = send_email.delay(mail_address)
return HttpResponse(send_result)
重启celery:celery -A REST02 worker --loglevel=info
启动django
在浏览器发送一个邮件试试
成功收到邮件