django celery 计划任务

本文介绍了如何在Django项目中配置Celery以适应国内时区,并展示了如何设置周期性任务,例如每秒执行一次的任务。通过设置TIME_ZONE及使用crontab时间表达式来管理计划任务。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

设置时区
计划任务默认是时区使用的是UTC时间, 我们需要设置为国内的时区。

timezone = 'Asia/Shanghai'

针对django项目当中可以通过设置TIME_ZONE,
文件 proj/proj/settings

LANGUAGE_CODE = 'zh-hans'

TIME_ZONE = 'Asia/Shanghai' 

CELERY_TIMEZONE = TIME_ZONE
...

或者单独给celery进行设置

app.conf.timezone = 'Asia/Shanghai' # 设置时区

周期性任务
我们先执行一个简单的计划任务

每秒执行一次

# task.py
from celery import Celery
from celery.schedules import crontab

CELERY_RESULT_BACKEND = 'redis://127.0.0.1/5'
BROKER_URL = 'redis://127.0.0.1/6'

TIME_ZONE = 'Asi
### 如何在 Django 中使用 Celery 设置周期任务 #### 1. 安装依赖库 为了实现 DjangoCelery 的集成以及支持周期任务功能,需要安装以下 Python 库: - `celery`: 提供核心的任务队列功能。 - `django-celery-beat`: 支持通过数据库管理周期任务。 可以通过 pip 安装这些库: ```bash pip install celery django-celery-beat ``` --- #### 2. 创建 Celery 配置文件 在项目的根目录下(通常是 settings.py 所在的目录),创建一个新的文件名为 `celery.py`。该文件用于初始化 Celery 对象并加载必要的配置[^1]: ```python import os from celery import Celery os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'your_project_name.settings') app = Celery('your_project_name') app.config_from_object('django.conf:settings', namespace='CELERY') app.autodiscover_tasks() ``` > **注意**: 将 `your_project_name` 替换为实际的 Django 项目名称。 --- #### 3. 修改 `__init__.py` 为了让 Django 启动时自动加载 Celery 配置,在同一目录下的 `__init__.py` 文件中添加如下代码[^1]: ```python from .celery import app as celery_app __all__ = ('celery_app',) ``` 这一步确保了当 Django 加载应用时会一并加载 Celery 配置。 --- #### 4. 更新 `settings.py` 在 Django 的 `settings.py` 文件中,添加或修改以下配置项以支持 Celery 及其周期任务功能[^2][^3]: ```python # Celery Broker URL (推荐使用 Redis 或 RabbitMQ) CELERY_BROKER_URL = 'redis://localhost:6379/0' # 结果存储后端 (可选) CELERY_RESULT_BACKEND = 'redis://localhost:6379/0' # 数据库调度器 (启用 djcelery.schedulers.DatabaseScheduler) CELERY_BEAT_SCHEDULER = 'django_celery_beat.schedulers:DatabaseScheduler' ``` 如果未安装 Redis,则可以替换为其他消息中间件(如 RabbitMQ)。同时,确保 Redis 已经运行在本地主机上。 --- #### 5. 初始化数据库表结构 由于启用了 `django-celery-beat` 插件,因此需要迁移数据库以生成相关的表结构: ```bash python manage.py migrate ``` 此时会在数据库中看到由 `django-celery-beat` 自动生成的一系列表格,例如 `django_celery_beat_periodictask` 等。 --- #### 6. 添加周期任务 有多种方式定义周期任务,以下是两种常见方法: ##### 方法一:使用 `@periodic_task` 装饰器 可以在任意模块中定义一个简单的周期任务函数,并用 `@periodic_task` 装饰它[^4]: ```python from celery import shared_task from celery.schedules import crontab from your_app.tasks import periodic_task @shared_task def my_periodic_task(): print("This task runs every minute.") my_periodic_task.apply_async(countdown=60) # 每分钟触发一次 ``` 或者更复杂的 Crontab 表达式也可以被接受: ```python @periodic_task(run_every=crontab(hour=8, minute=0)) def daily_report(): """ 每天早上 8 点发送报告邮件 """ send_email_to_admins() ``` ##### 方法二:通过 Admin 页面手动配置 另一种灵活的方式是在后台管理系统中动态添加周期任务。访问 `/admin/django_celery_beat/periodictask/add/` 并填写相应的字段来设定新任务的时间间隔、参数等内容。 --- #### 7. 启动 Celery Worker 和 Beat 完成上述步骤之后,分别启动 Celery worker 和 beat 来处理任务队列和计划任务: ```bash # 启动 Celery Worker celery -A your_project_name worker --loglevel=info # 启动 Celery Beat Scheduler celery -A your_project_name beat --loglevel=info ``` 两个进程应保持独立运行状态以便更好地监控各自的工作情况。 --- ### 总结 综上所述,借助于 `django-celery-beat` 插件能够轻松实现在 Django 应用中的复杂定时作业安排机制。只需按照前述指南逐步操作即可快速部署一套完整的解决方案[^1]^. ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值