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

在浏览器发送一个邮件试试


成功收到邮件

本文详细介绍了如何在Django项目中集成Celery,实现异步任务处理,包括安装配置、发送异步邮件及性能测试。通过具体步骤和代码示例,帮助读者快速上手。
&spm=1001.2101.3001.5002&articleId=104183077&d=1&t=3&u=62fe1e63921047469f1e6c47698c29ad)

被折叠的 条评论
为什么被折叠?



