Django 6.0 后台任务新特性指南
Django 6.0 提供任务定义与入队 API;生产异步执行仍需第三方持久化后端与 worker。本文讲解 django.tasks 的核心概念、任务定义、后端配置、视图入队与 worker 运行。
直接回答:Django 6.0 引入原生后台任务框架 django.tasks,提供标准化 API 在请求响应周期之外执行工作——发邮件、处理文件、跑耗时操作不再阻塞用户,它本身不提供生产 worker 或持久化队列,仍需选择执行后端。
为什么后台任务重要
请求-响应周期里做慢操作(发邮件、调外部 API、处理上传文件),用户就得干等。后台任务把这类工作移出请求路径:接口秒回,活在后台干。这是现代 Web 应用体验的基本要求。
Django 的思路演变
过去 Django 生态的答案一直是 Celery——强大但重型:要装消息中间件(Redis/RabbitMQ)、要学一套独立的概念体系。对于"我只是想异步发个邮件"的场景,杀鸡用了牛刀。Django 6.0 的 django.tasks 补上了这块拼图:框架内置统一的任务 API,执行后端可插拔。
django.tasks 实际做了什么
它定义了一套标准接口:@task 装饰器定义任务、enqueue() 入队、后端(backend)负责真正执行。开发期用内置后端零依赖跑起来,生产需评估第三方持久化后端及其 worker,不应假定重试与结果保留语义完全一致。
上手实战
定义任务(tasks.py):
from django.tasks import task
from django.contrib.auth import get_user_model
from django.core.mail import send_mail
User = get_user_model()
@task
def send_welcome_email(user_id: int):
user = User.objects.get(pk=user_id)
send_mail("欢迎!", "感谢注册", "noreply@example.com", [user.email])
视图里入队(局部示例,需导入 django.db.transaction、JsonResponse,并实现 create_user 的校验及 CSRF 防护):
def signup(request):
user = create_user(request.POST)
transaction.on_commit(lambda: send_welcome_email.enqueue(user_id=user.id))
return JsonResponse({"status": "ok"})
配置后端(settings.py):内置 ImmediateBackend 同步执行,不缩短请求等待;DummyBackend 仅用于测试且不执行任务。
TASKS = {"default": {"BACKEND": "django.tasks.backends.immediate.ImmediateBackend"}}
生产需安装兼容 Django 6.0 的第三方持久化后端。参数和返回值须能经过 JSON 序列化往返。
跑 worker:Django 核心没有通用 db_worker 命令;以第三方后端文档为准。事务提交后入队也不是原子双写,高可靠业务需 outbox 等补偿机制。
查状态:任务记录带状态字段(待执行/执行中/成功/失败),可通过后端支持的 TaskResult 接口查询,并非自带管理后台。测试时为任务记录执行编号、入队时间、开始时间和终态;用一次失败任务核对结果接口与 worker 日志,区分排队等待和执行耗时。
什么时候仍需 Celery
django.tasks 定义 API 与结果接口;异步执行及持久化由后端实现。以下需求仍属于 Celery(或其他队列)的领地:复杂的任务编排(链式/分组/和弦)、精细的优先级队列、跨语言任务、超大规模吞吐。好消息是 API 边界清晰,日后迁移成本可控。
常见问题(FAQ)
Q:Django 6.0 的任务支持定时调度吗?
A:django.tasks 聚焦"入队即执行"。周期调度仍需 cron、APScheduler 或 celery-beat 触发任务入队。
Q:任务失败了会自动重试吗?
A:取决于后端配置。生产部署建议显式配置重试次数与退避策略,并把终态失败接入告警。
Q:旧项目升级值得吗?
A:已经在用 Celery 且用得顺:不必换。新项目或只用 Celery 做简单异步的项目:可评估统一 API,但应同时比较后端、worker、维护成熟度及迁移成本。
官方参考
本文基于官方文档整理,未进行运行时或性能测试。示例中的业务函数、数据模型和部署地址需结合项目补全;局部片段不等同于完整生产应用。