celery是项目中不可或缺的神器
比如,当我们注册账户的时候,需要发送邮箱验证码
主程序运行到这来,邮箱发送可能需要30秒
不可能网页加载30秒,一直转圈圈,等邮件发送完毕才能进行下一步操作吧
这样你的项目上线后除了你自己基本没人会注册
还有
比如判断用户登录是否为每日首次登录,
当项目较小的时候,有一种策略就是设置一个用户每日登录状态的字段,当用户当日
登录过,就修改该状态为False,然后用celery进行定时任务,每日凌晨多少点重置用户登录状态的字段
关于celery的强大还有许多,目前就说常用的几种把
接下来是celery配置
startapp一个CeleryTask的app,然后注册
Pip install django-celery=3.2.2
Pip install django-redis=4.10.0
pip install redis==2.10.6
Pip install flower #暂时不用
然后照着我这个版本下载就行了
目前来讲最为稳定的版本组合
然后
#settings文件
INSTALLED_APPS = [
'xadmin',
........
'CeleryTask.apps.CelerytaskConfig',
'djcelery',
]
import djcelery
djcelery.setup_loader()
#使用本地redis服务器中的0号数据库,redis密码为123456
BROKER_URL = 'redis://127.0.0.1:6379/0'
CELERYBEAT_SCHEDULER = 'djcelery.schedulers.DatabaseScheduler'
CELERY_RESULT_BACKEND = 'redis://127.0.0.1:6379/1'
CELERY_TASK_SERIALIZER = 'json'
CELERY_RESULT_SERIALIZER = 'json'
CELERY_ENABLE_UTC = False
CELERY_TIMEZONE = 'Asia/Shanghai'
CELERY_TASK_RESULT_EXPIRES = 10
CELERY_ACCEPT_CONTENT = ['pickle', 'json', 'msgpack', 'yaml']
CELERY_IMPORTS = ("CeleryTask.tasks",)
在settings统计目录中创建celery.py文件
from __future__ import absolute_import
import os
from celery import Celery, platforms
from django.conf import settings
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'blog_run.settings')
#主应用名,blog_run其实可以替换成你喜欢的任何一个名称
app = Celery('blog_run')
platforms.C_FORCE_ROOT = True
# 配置应用
app.conf.update(
# 本地Redis服务器
BROKER_URL=settings.BROKER_URL,
)
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))
主项目目录的init中(也是和settings统计的那个)
from __future__ import absolute_import
from blog_run.celery import app as celery_app
import pymysql
pymysql.install_as_MySQLdb()
接下来别忘了迁移数据库
python manage.py check
python manage.py makemigrations
python manage.py migrate
三步走战略
会生成6个celery的管理表
因为我的项目使用的是mysql,所以在mysql里可以看到:
如果你在迁移的时候,报错,说是什么超过767字节长度,
这种错误是因为添加索引的字段,mysql有长度要求
比如说varchar(255)
按字符转字节按乘3计算
255*3>767
所以无法创建数据表
如果你出现了删除的报错
那么我估计你使用的应该是utf8mb4字符集
如果你不想去修改配置文件增加此类字段长度或者重新更换innodb字符集的话
最最最最最简单的办法就是,
没错,新建一个utf8的字符集的数据库
然后更改配置里面的名字
好了 继续往下
来到app中,创建两个py文件
一个tasks
一个adminx
tasks.py中:
@app.task(name='tasks.fresh_user')
def fresh_user():
User.objects.filter(is_fresh=False).update(is_fresh=True)
return '用户状态刷新完成'
@app.task
def email_send(email):
time.sleep(10)
print('发送邮件',email)
return '已发送'
定时任务fresh_user
记得加name='tasks.fresh_user’这句话,帮助worker定位项目
异步任务email_send,则随意啦,反正多放在视图里面调用
注册好两个任务后
xadmin文件登场:
from __future__ import absolute_import, unicode_literals
import xadmin
from djcelery.models import (
TaskState,
WorkerState,
PeriodicTask,
IntervalSchedule,
CrontabSchedule,
)
xadmin.site.register(IntervalSchedule) # 存储循环任务设置的时间
xadmin.site.register(CrontabSchedule) # 存储定时任务设置的时间
xadmin.site.register(PeriodicTask) # 存储任务
xadmin.site.register(TaskState) # 存储任务执行状态
xadmin.site.register(WorkerState) # 存储执行任务的worker
好了,非常完美
来看看在界面是怎样的
嗯,接下来添加任务
首先interval可以理解为计时
crontab用户linux的肯定都很熟了,定时任务
先把两个新增上时间限制:
这个指的是每15秒执行一次
crontab新增:
这个指的是每天凌晨4点执行一次
新增定时任务:
有几个地方要特别注意
interval和crontab只能选一个
name如果是按照我的配置来的,名字也要照我的格式命名
argument我这里没写,如果有参数,传入的是列表形式,也就是其他语言的数组形式
设置为保存即可
来尝试运行一下定时任务
首先打开两个终端
最最最最最最最最最快的方法
然后开启redis
redis在windows环境下怎么开启呢????
太多了,这里不写,下次再说,等不及的右上点+,自行百度
最后分别输入两个命令
添加任务到broker:celery -A blog_run beat -l info (–max-inteval #这段可加可不可加,代表每十秒唤醒一次)
处理broker任务:
celery -A blog_run worker -l info -P eventlet
#eventlet 需要下载
我这里写的blog_run你们可替换你们的项目名称,这个可以改,只要是settings和celery配置文件所在的目录就行了
异步任务放在视图里调用就行了
然后开启celery
python manage.py celery worker -A blog_run -l info
redis在执行命令前开启,别忘了
就说到这里了,下次抽个空来讲讲邮件系统