1:概述
用户在浏览器界面发起request请求,并瞪大response响应,在某些视图中,可能要执行一些耗时操作,比如发邮件,发短信验证码,从发起到用户接收,需要等待较长时间,在此期间,用户不能做任何操作,会造成用户体验差,因此需要采用celery操作,将耗时操作封装成函数,交给celery的工人worker去操作,用户发起请求后,立即回返回响应,耗时操作在后台继续进行,不影响前台的用户操作,提高用户的体验度
2,首先下载三个安装包,安装包的版本根据实际情况更改
sudo pip install celery3.1.25
sudo pip install celery-with-redis3.0
sudo pip install django-celery==3.2.1
3,在settings文件中的INSTALLED_APPS中激活,即配置应用的位置,添加djcelery
INSTALLED_APPS = [
** ‘django.contrib.admin’,
** ‘django.contrib.auth’,
** ‘django.contrib.contenttypes’,
** ‘django.contrib.sessions’,
** ‘django.contrib.messages’,
**‘django.contrib.staticfiles’,
** ‘myApp’,
** ‘djcelery’,
]
3,配置redis
#celery
import djcelery
djcelery.setup_loader()
#redis链接串:“redis://:密码@主机ip:端口/库序号”
BROKER_URL = “redis://:redis密码@47.94.161.66:6379/0”
#注册任务文件:应用名.task
CELERY_IMPORTS = “myApp.task”
4,在应用目录下创建名为task.py的文件
5,在与工程目录同名的目录下创建名为celery.py的文件
6,文件内容
from future import absolute_import
import os
from celery import Celery
from django.conf import settings
os.environ.setdefault(‘DJANGO_SETTINGS_MODULE’, ‘whthas_home.settings’)
app = Celery(‘project’)
app.config_from_object(‘django.conf:settings’)
app.autodiscover_tasks(lambda: settings.INSTALLED_APPS)
@app.task(bind=True)
def debug_task(self):
print(‘Request: {0!r}’.format(self.request))
11,除了app=Celery(“project”),括号中的内容修改为自己的工程名外,其他的代码不用动
12,在与工程目录同名的 目录下的__init__.py文件中添加代码:
from .celery import app as celery_app
13,迁移生成相关表:
python manage.py migrate
14,在task.py文件中,封装耗时操作的任务函数,比如发送邮件,发送验证码的函数,这里只简单模拟发送邮件的耗时操作
import time
from celery import task
@task
def longIo():
** print(“开始耗时操作。。。。”)
** time.sleep(5)
** print(“结束耗时操作”)
15,注意封装的耗时操作函数必须添加装饰器@task,否则该函数就只是一个普通函数
16,views视图中定义相关的视图函数,如
from day47.task import longIo
def register(request):
** if request.method == “GET”:
** return render(request,“register.html”)
** else:
** # 将任务放入队列
****** longIo.delay()
****** return HttpResponse(“发送成功”)
17,启动redis和Django服务
18,启动worker:python manage.py celery worker --loglevel=info
18,此时如果注册时需要给用户发送激活邮件,验证码等信息,用户点击发送以后,会立即返回“发送成功”,后台会同时进行发送邮件,验证码等耗时操作,用户等待期间可以操作浏览器,进行其他操作,提高用户体验度