1、在Django中使用celery的定时任务需要安装django-celery-beat
pip install django-celery-beat
2、在Django的settings中注册django_celery_beat
INSTALLED_APPS = ( ..., 'django_celery_beat', )
3、执行创建表命令
如果迁移不成功 报cerely_task的错误 那就把关于celery的导包全部放在方法里面
python3 manage.py makemigrations
python3 manage.py migrate
4、在与项目同名的目录下的celery.py中添加定时任务
from celery import Celery import os,sys import django # 1.添加django项目根路径 CELERY_BASE_DIR = os.path.dirname(os.path.abspath(__file__)) sys.path.insert(0, os.path.join(CELERY_BASE_DIR, '../loonflow')) # 2.添加django环境 os.environ.setdefault("DJANGO_SETTINGS_MODULE","loonflow.settings") django.setup() # 读取配置 # 3.celery基本配置 app = Celery('proj', broker='redis://localhost:6379/14', backend='redis://localhost:6379/15', include=['celery_task.tasks', 'celery_task.tasks2', ]) # 4.实例化时可以添加下面这个属性 app.conf.update( result_expires=3600, #执行结果放到redis里,一个小时没人取就丢弃 ) # 5.配置定时任务:每5秒钟执行 调用一次celery_pro下tasks.py文件中的add函数 app.conf.beat_schedule = { 'add-every-5-seconds': { 'task': 'celery_task.tasks.test_task_crontab', 'schedule': 5.0, 'args': (16, 16) }, } # 6.添加时区配置 app.conf.timezone = 'UTC' if __name__ == '__main__': app.start()
5、讲方法写入目录下的task方法中
from .celery import app #从当前目录导入app import os,sys from .celery import CELERY_BASE_DIR # 1.test_task_crontab测试定时任务 @app.task def test_task_crontab(x, y): # 添加django项目路径 sys.path.insert(0, os.path.join(CELERY_BASE_DIR, '../loonflow')) from utils.rl_sms import test_crontab res = test_crontab(x, y) return x + y # 2.测试异步发送邮件 @app.task(bind=True) def send_sms_code(self, mobile, datas): sys.path.insert(0, os.path.join(CELERY_BASE_DIR, '../loonflow')) # 在方法中导包 from utils.rl_sms import send_message # time.sleep(5) try: # 用 res 接收发送结果, 成功是:0, 失败是:-1 res = send_message(mobile, datas) except Exception as e: res = '-1' if res == '-1': # 如果发送结果是 -1 就重试. self.retry(countdown=5, max_retries=3, exc=Exception('短信发送失败'))
6、讲方法写入目录下的task2方法中
from .celery import app import time,random @app.task def randnum(start,end): time.sleep(3) return random.randint(start,end)
7、setting里面的配置
# 配置邮件发送 EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend' EMAIL_HOST = 'smtp.163.com' # 如果为163邮箱,设置为smtp.163.com EMAIL_PORT = 25 # 或者 465/587是设置了 SSL 加密方式 # 发送邮件的邮箱 EMAIL_HOST_USER = 'wangsai_python@163.com' # 在邮箱中设置的客户端授权密码 EMAIL_HOST_PASSWORD = 'XNFDYDCJXIUDGOEX' # 第三方登陆使用的授权密码 EMAIL_USE_TLS = True # 这里必须是 True,否则发送不成功 # 收件人看到的发件人, 必须是一直且有效的 EMAIL_FROM = 'hr<wangsai_python@163.com>' DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
浙公网安备 33010602011771号