Django和Celery的异步任务案例

2025-04-06T19:40:00+08:00 | 4分钟阅读 | 更新于 2025-04-06T19:40:00+08:00

Macro Zhao

Django和Celery的异步任务案例

推荐超级课程:

@TOC

在Django中进行缓存是一种通过存储频繁访问的数据来提高网页应用程序性能的重要技术。 异步任务允许Django应用程序在HTTP请求-响应周期之外执行耗时的操作。这提高了性能和用户体验。

我们将探讨:

  1. 在Django中设置Celery。
  2. 使用消息代理(Redis)进行任务排队。
  3. 创建和运行异步任务。
  4. 一个小型项目,集成Celery用于邮件通知。

先决条件

  1. 系统上安装了Python。
  2. 在系统上创建并激活虚拟环境。
  3. 创建了Django项目(django-celery-demo)。
  4. 安装并运行了Redis服务器。

步骤1:安装依赖项

运行以下命令以安装Celery和Redis包以及Django:

pip install celery[redis] django

步骤2:配置Celery

2.1 创建celery.py

在您的Django项目文件夹中(与settings.py同一级别),创建一个名为celery.py的文件。并将以下代码粘贴进去。可能需要根据您的项目名称进行更改。

from __future__ import absolute_import, unicode_literals  
import os  
from celery import Celery  
  
  
# 设置Celery的默认Django设置模块  
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'django_celery_demo.settings')  
  
app = Celery('django_celery_demo')  
  
# 使用字符串在这里意味着工作进程不需要序列化对象  
app.config_from_object('django.conf:settings', namespace='CELERY')  
  
# 在Django应用中自动发现任务  
app.autodiscover_tasks()  
  
  
@app.task(bind=True)  
def debug_task(self):  
    print(f'请求:{self.request!r}')

2.2 更新 __init__.py

修改你的项目 __init__.py 以导入 Celery:

from __future__ import absolute_import, unicode_literals  
  
# 这将确保当Django启动时总是导入app  
from .celery import app as celery_app  
  
__all__ = ('celery_app',)

步骤3:配置Django设置

settings.py文件中,添加Celery和Redis配置:

# Redis设置  
CELERY_BROKER_URL = 'redis://localhost:6379/0'  
  
# 任务设置  
CELERY_ACCEPT_CONTENT = ['json']  
CELERY_TASK_SERIALIZER = 'json'

步骤4:定义Celery任务

4.1 创建 tasks.py

你需要先创建app,然后在你的Django应用之一(例如,app_name)中创建一个 tasks.py 文件。

from celery import shared_task  
import time  
  
  
@shared_task # 不要忘记添加这个装饰器  
def add(x, y):  
    time.sleep(5)  # 模拟一个耗时的任务  
    return x + y  
  
@shared_task # 不要忘记添加这个装饰器  
def send_email_task(email):  
    print(f'向 {email} 发送邮件')  
    time.sleep(5)  # 模拟发送邮件  
    print('邮件发送成功!')  
    return "邮件已发送"

步骤5:启动Celery工作进程

在你的终端中像下面这样运行Celery工作进程:

celery -A django_celery_demo worker --loglevel=info

步骤6:测试任务

6.1 调用任务

你可以在Django shell中测试任务。

python manage.py shell

运行以下代码:

from app_name.tasks import add  
  
result = add.delay(4, 5)  
print(result.id)  # 任务ID

6.2 检查任务状态

要检查任务状态:

result.status  # 例如,'PENDING', 'SUCCESS'  
result.result  # 如果完成,任务结果

步骤7:创建一个小项目

我们将构建一个使用异步发送邮件通知的项目。

7.1 邮件队列模型

models.py 中我们需要添加这个模型。

from django.db import models  
  
  
class Email(models.Model):  
    email = models.EmailField()  
    subject = models.CharField(max_length=255)  
    message = models.TextField()  
    status = models.CharField(max_length=50, default='PENDING')

7.2 邮件提交表单

forms.py 中:

from django import forms  
from .models import Email  
  
class EmailForm(forms.ModelForm):  
    class Meta:  
        model = Email  
        fields = ['email', 'subject', 'message']

7.3 处理邮件提交的视图

views.py 中:

from django.shortcuts import render, redirect  
from .forms import EmailForm  
from .models import Email  
from .tasks import send_email_task  
  
  
def send_email_view(request):  
    if request.method == 'POST':  
        form = EmailForm(request.POST)  
        if form.is_valid():  
            email_instance = form.save()  
            # 触发Celery任务  
            send_email_task.delay(email_instance.email)  
            email_instance.status = 'SENT'  
            email_instance.save()  
            return redirect('success')  
    else:  
        form = EmailForm()  
    return render(request, 'email_form.html', {'form': form})

7.4 邮件提交模板

创建一个 templates/email_form.html:

<!DOCTYPE html>  
<html lang="en">  
<head>  
    <meta charset="UTF-8">  
    <title>发送邮件</title>  
</head>  
<body>  
    <h1>发送邮件</h1>  
    <form method="post">  
        {% csrf_token %}  
        {{ form.as_p }}  
        <button type="submit">发送</button>  
    </form>  
</body>  
</html>

步骤8:运行项目

  1. 启动Redis服务器:
redis-server
  1. 启动Django服务器:
python manage.py runserver
  1. 启动Celery工作进程:
celery -A django_celery_demo worker --loglevel=info
  1. 打开 /send-email/ 的表单,填写详细信息,然后提交。

步骤9:监控Celery任务

要监控任务,使用Flower,一个用于监控Celery的基于Web的工具:

pip install flower  
celery -A django_celery_demo flower

感谢阅读。如果你发现有什么错误或更好的方法,请在下面的评论中告诉我。

如果你喜欢这篇文章,请点击下面的👍按钮,以便其他人也能发现它有用。你可以关注我

© 2011 - 2025 Macro Zhao的分享站

关于我

如遇到加载502错误,请尝试刷新😄

Hi,欢迎访问 Macro Zhao 的博客。Macro Zhao(或 Macro)是我在互联网上经常使用的名字。

我是一个热衷于技术探索和分享的IT工程师,在这里我会记录分享一些关于技术、工作和生活上的事情。

我的CSDN博客:
https://macro-zhao.blog.csdn.net/

欢迎你通过评论或者邮件与我交流。
Mail Me

推荐好玩(You'll Like)
  • AI 动·画
    • 这是一款有趣·免费的能让您画的画中的角色动起来的AI工具。
    • 支持几十种动作生成。
我的项目(My Projects)
  • 爱学习网

  • 小乙日语App

    • 这是一个帮助日语学习者学习日语的App。
      (当然初衷也是为了自用😄)
    • 界面干净,简洁,漂亮!
    • 其中包含 N1 + N2 的全部单词和语法。
    • 不需注册,更不需要订阅!完全免费!
  • 小乙日文阅读器

    • 词汇不够?照样能读日语名著!
    • 越读积累越多,积跬步致千里!
    • 哪里不会点哪里!妈妈再也不担心我读不了原版读物了!
赞助我(Sponsor Me)

如果你喜欢我的作品或者发现它们对你有所帮助,可以考虑给我买一杯咖啡 ☕️。这将激励我在未来创作和分享更多的项目和技术。🦾

👉 请我喝一杯咖啡

If you like my works or find them helpful, please consider buying me a cup of coffee ☕️. It inspires me to create and share more projects in the future. 🦾

👉 Buy me a coffee