django celery 周期任务
时间: 2025-05-28 22:30:54 浏览: 25
### 如何在 Django 中使用 Celery 设置周期任务
#### 1. 安装依赖库
为了实现 Django 和 Celery 的集成以及支持周期任务功能,需要安装以下 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]^.
---
阅读全文
相关推荐



















