异步任务利器Celery(二)在django项目中使用Celery

13【异步利器】Django与Celery集成指南:构建高效可扩展的后台任务系统 本文介绍了如何将Django与Celery集成,以构建高效可扩展的后台任务系统。现代Web应用需要处理大量耗时任务,如发送邮件、文件处理和定期维护,这些任务如果同步执行会导致用户体验下降。Celery作为Python生态中的分布式任务队列,能够将这些任务异步处理,提升应用性能。 文章首先介绍了Celery的核心架构,包括客户端、中间人、工作节点、结果后端和Beat调度器,并解释了任务的消息流程。接着,详细讲解了如何在Django项目中配置Celery,包括环境准备、基础配置、创建任务和启动Celery工作节 阅读详情

Celery 4.0支持django1.8及以上的版本,低于1.8的项目使用Celery 3.1。

一个django项目的组织如下:

- proj/
  - manage.py
  - proj/
    - __init__.py
    - settings.py
    - urls.py

首先建立proj/proj/celery.py文件:

from __future__ import absolute_import, unicode_literals
import os
from celery import Celery

# set the default Django settings module for the 'celery' program.
os.environ.setdefault('DJANGO_SETTINGS_MODULE', 'proj.settings')

app = Celery('proj')

# Using a string here means the worker doesn't have to serialize
# the configuration object to child processes.
# - namespace='CELERY' means all celery-related configuration keys
#   should have a `CELERY_` prefix.
app.config_from_object('django.conf:settings', namespace='CELERY')

# Load task modules from all registered Django app configs.
app.autodiscover_tasks()


@app.task(bind=True)
def debug_task(self):
    print('Request: {0!r}'.format(self.request))

然后要保证django项目启动时上述的app被载入,修改proj/proj/__init__.py文件:

from __future__ import absolute_import, unicode_literals

# This will make sure the app is always imported when
# Django starts so that shared_task will use this app.
from .celery import app as celery_app

__all__ = ['celery_app']

现在就可以在INSTALLED_APPS中的app下建立tasks.py文件啦:

- app1/
    - tasks.py
    - models.py
- app2/
    - tasks.py
    - models.py

比如:

# Create your tasks here
from __future__ import absolute_import, unicode_literals
from celery import shared_task


@shared_task
def add(x, y):
    return x + y


@shared_task
def mul(x, y):
    return x * y


@shared_task
def xsum(numbers):
    return sum(numbers)

在views中调用这些tasks即可异步运行。

如果使用Redis作为broker,在settings.py中添加:

CELERY_BROKER_URL = 'redis://localhost:6379/0'

可以使用Django ORM/Cache作为储存backend。

下载库:

$ pip install django-celery-results

设定settings.py:

INSTALLED_APPS = (
    ...,
    'django_celery_results',
)

建立数据表:

$ python manage.py migrate django_celery_results

在settings.py中添加Celery设置:

CELERY_RESULT_BACKEND = 'django-db'
CELERY_RESULT_BACKEND = 'django-cache'

启动:

$ celery -A proj worker -l info

可以在python manage.py shell中调用:

$ python manage.py shell
Python 2.7.12 (default, Nov 19 2016, 06:48:10) 
[GCC 5.4.0 20160609] on linux2
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>> from app1.tasks import add
>>> add.delay(3,4)
<AsyncResult: a9abab6d-b7a9-47e6-8c09-ec284948449f>

celery日志:

[2017-09-14 00:09:41,432: INFO/ForkPoolWorker-1] Task urldata.tasks.add[38af760e-ed6c-48f8-b77c-d67bade8d6b8] succeeded in 0.00782653002534s: 7

官方一个完整的例子:https://github.com/celery/celery/tree/master/examples/django/

官方文档还有一个异步审查用户上传评论的例子。

blog/models.py:

from django.db import models
from django.utils.translation import ugettext_lazy as _


class Comment(models.Model):
    name = models.CharField(_('name'), max_length=64)
    email_address = models.EmailField(_('email address'))
    homepage = models.URLField(_('home page'),
                               blank=True, verify_exists=False)
    comment = models.TextField(_('comment'))
    pub_date = models.DateTimeField(_('Published date'),
                                    editable=False, auto_add_now=True)
    is_spam = models.BooleanField(_('spam?'),
                                  default=False, editable=False)

    class Meta:
        verbose_name = _('comment')
        verbose_name_plural = _('comments')

在views中先保存评论,同时调用celery异步审核。

blog/views.py:

from django import forms
from django.http import HttpResponseRedirect
from django.template.context import RequestContext
from django.shortcuts import get_object_or_404, render_to_response

from blog import tasks
from blog.models import Comment


class CommentForm(forms.ModelForm):

    class Meta:
        model = Comment


def add_comment(request, slug, template_name='comments/create.html'):
    post = get_object_or_404(Entry, slug=slug)
    remote_addr = request.META.get('REMOTE_ADDR')

    if request.method == 'post':
        form = CommentForm(request.POST, request.FILES)
        if form.is_valid():
            comment = form.save()
            # Check spam asynchronously.
            tasks.spam_filter.delay(comment_id=comment.id,
                                    remote_addr=remote_addr)
            return HttpResponseRedirect(post.get_absolute_url())
    else:
        form = CommentForm()

    context = RequestContext(request, {'form': form})
    return render_to_response(template_name, context_instance=context)

tasks如下:

blog/tasks.py

from celery import Celery

from akismet import Akismet

from django.core.exceptions import ImproperlyConfigured
from django.contrib.sites.models import Site

from blog.models import Comment


app = Celery(broker='amqp://')


@app.task
def spam_filter(comment_id, remote_addr=None):
    logger = spam_filter.get_logger()
    logger.info('Running spam filter for comment %s', comment_id)

    comment = Comment.objects.get(pk=comment_id)
    current_domain = Site.objects.get_current().domain
    akismet = Akismet(settings.AKISMET_KEY, 'http://{0}'.format(domain))
    if not akismet.verify_key():
        raise ImproperlyConfigured('Invalid AKISMET_KEY')


    is_spam = akismet.comment_check(user_ip=remote_addr,
                        comment_content=comment.comment,
                        comment_author=comment.name,
                        comment_author_email=comment.email_address)
    if is_spam:
        comment.is_spam = True
        comment.save()

    return is_spam

  

 

基于Django与Celery的端口漏洞扫描系统:开箱即用的安全运维部署方案 在网络安全与运维领域,自动化资产发现与漏洞探测是构建主动防御体系的基础。其核心原理在于通过网络扫描技术,识别目标主机的开放端口及运行的服务,进而依据漏洞库进行风险评估。这项技术的价值在于将繁琐的人工排查转化为高效的自动化流程,极大地提升了安全运维的效率和覆盖面。典型的应用场景包括企业内网资产梳理、暴露面收敛以及周期性安全巡检。本文聚焦于一个基于Django Web框架与Celery分布式任务队列构建的端口漏洞扫描系统,它集成了MySQL数据库与Redis消息中间件,提供了一个功能完整、部署便捷的解决方案。该 阅读详情

相关推荐

Flower:Celery集群监控与管理的可视化利器

分布式任务队列是现代异步编程的核心组件,Celery作为Python生态中的主流解决方案,其集群监控与管理一直是运维难点。通过Web可视化工具实现任务状态追踪和性能分析,能显著提升分布式系统的可观测性。Flower作为Celery官方推荐的监控工具,提供了实时仪表盘、任务生命周期追踪和远程控制等核心功能,支持Prometheus和Grafana集成,是构建高效任务调度系统的重要基础设施。在生产环境中,结合Redis或RabbitMQ等消息中间件,Flower能有效解决任务积压、Worker负载不均等典型问题

weixin_28832121的博客 250

Django 中celery的使用

1、django应用Celery django框架请求/响应的过程是同步的,框架本身无法实现异步响应。 但是我们在项目过程中会经常会遇到一些耗时的任务, 比如:发送邮件、发送短信、大数据统计等等,这些操作耗时长,同步执行对用户体验非常不友好,那么在这种情况下就需要实现异步执行。 异步执行前端一般使用ajax,后端使用Celery。 2 、项目应用 django项目应用celery,主要有两种任务方式,一是异步任务(发布者任务),一般是web请求,二是定时任务。 celery组成请看celery介

qq_53582111的博客 1万+

详解 Django 业务剥离:集成 Celery 打造高可用异步任务与定时调度矩阵

本文探讨了在Django Web应用中利用Celery进行业务剥离的解决方案。针对传统同步Web应用处理耗时任务(如IO密集型操作、CPU密集型计算等)导致性能瓶颈的问题,提出将耗时业务逻辑与前端交互分离的架构设计。文章详细分析了Celery的核心组件架构、并发模型选择,并提供了Django与Celery深度集成的实践指南,包括项目初始化、配置设置、异步任务编写及触发方法。通过这种异步处理方案,可以显著提升Web应用的响应速度和服务可用性,同时确保耗时任务在后台可靠执行。

数据知道的博客 226

Django中celery的使用

django中celery的使用,异步任务,定时任务,以及任务的结果查看

分享各种测试中的用到的内容,一起学习 4322

基于Django与Celery的IPTV直播源管理系统设计与实现

在流媒体技术领域,直播源管理是构建稳定IPTV服务的基础。其核心原理在于对视频流地址进行有效的采集、验证与分发。通过自动化任务队列技术,可以实现直播源的高效、异步验证,确保播放列表的实时性与可靠性。这一技术方案对于提升家庭媒体中心或小范围共享服务的播放体验具有重要价值,尤其适用于需要个性化频道管理与播放控制的场景。本文以热门的Django框架和Celery异步任务队列为核心,结合FFmpeg流处理,详细解析了如何构建一个集直播源全生命周期管理、用户权限控制与实时转码代理于一体的IPTV后台管理系统,为搭建私

weixin_34268843的博客 317

用化学方法nmp溶剂从佳能cmos传感器上剥离拜耳矩阵和微透镜

将光刻胶暴露于 NMP 溶剂中 10-15 分钟,并进行轻微的机械搅拌,将溶解的光刻胶从基材表面带走,即可去除大部分光刻胶,之后再进行第二次溶剂浴,以洗去微量含有光刻胶的溶剂。我还担心传感器的校准问题,我觉得可以大致解决这个问题,比如在安装面上用刻度尺标记三个螺丝的位置,然后数着拧出螺丝的圈数,直到听到“咔哒”声(螺纹完全拧出)。我还担心传感器的校准问题,我觉得可以大致解决这个问题,比如在安装面上用刻度尺标记三个螺丝的位置,然后数着拧出螺丝的圈数,直到听到“咔哒”声(螺纹完全拧出)。在我看来,这是必读的;

qq_40247880的博客 1473

Django-rest-framework(DRF)怎么使用celery

Celery是一个基于Python的分布式异步任务队列框架,支持实时任务处理和定时调度。其架构包含消息中间件(Broker)、任务执行单元(Worker)和结果存储(Backend)三部分。在Django中集成Celery需要安装相关库并配置Redis作为Broker和Backend,通过@shared_task装饰器定义异步任务函数,使用delay()方法提交任务,通过worker进程执行。Celery支持两种任务模式:delay()用于异步任务,apply_async()支持定时任务设置。该框架适用于邮

hhq2002322的博客 1961

uniapp串口通信实战:从零搭建物联网设备控制App(附完整代码)

本文详细介绍了如何使用Uniapp实现串口通信,从零搭建物联网设备控制App。内容涵盖环境配置、串口初始化、数据收发、错误处理等核心功能,并提供了完整的代码示例,帮助开发者快速掌握跨平台串口通信技术,适用于智能农业、工业自动化等物联网场景。

weixin_30369041的博客 597

Django高级扩展之celery使用

本文主要介绍了celery的应用场景; 如何安装及安装哪些类库; 异步和定时执行实现以及任务可视化管理。

json_li的博客 3021

VS2015+Qt+OpenCV+open62541开发过程(05_VS2015中使用OPCUA open62541通过Kepware读写PLC数据)

此外还需要所需lib包:WS2_32.Lib(opcua通讯用到的库,opcua使用socket通讯,需使用此库),添加#pragma comment(lib,"ws2_32.lib") 语句,有的文章说需要添加ws2_32.lib文件或ws2_32.dll到项目资源中,貌似影响不大。2.在VS中选择x64平台会报错,选择x86平台可以用,应该是ws2_32.lib相关的库不支持64位,目前没有解决,继续后面的实验,看看用Qt后是否可以解决。6.VS中建立的变量,与读取的OPC点数据类型注意对应。

zzh17的博客 1862

用人话讲明白线性回归LinearRegression

目录 什么是回归 一元线性回归 损失函数 最小二乘估计 小结 1. 什么是回归 当我们学习一门新课程、接触一个新专业时,总会对该领域的专有名词感到困惑,甚至看完解释仍难以理解其含义。在我们一起学习machine learning的过程中,我会尽量对相关名词用“人话”做一遍解释,以减少学习的“痛苦感”。 譬如今天要学的线性“回归”,这个回归(regression)和我们平时说的“回归祖国”的回...

化简可得 1万+

django中异步化celery的使用/celery中时区问题

~网站优化第一定律:缓存 (空间换时间) -热数据(热点数据):体量不大、访问频率极高、更新不频繁 ~网站优化第二定律:削峰 (能不马上做的事情都不要马上做)、消息队列 -遇到耗时间的任务(用户请求),用户不需要马上得到结果、异步化、推迟执行 -多线程 -异步消息队列 -celery #在django中使用celery模块提供消息队列服务 import os import celery from django.conf import settings os.environ.setdefault('DJAN

weixin_44634704的博客 2589

Maven的下载安装配置教程(详细图文)

目录 一、简单了解一下什么是Maven 二、maven的下载 三、maven的安装 四、maven的环境变量配置 五、setting文件配置 六、开发工具配置Maven 一、简单了解一下什么是Maven Maven就是一款帮助程序员构建项目的工具,我们只需要告诉Maven需要哪些Jar 包,它会帮助我们下载所有的Jar,极大提升开发效率。 1.Maven翻译为“专家“, ”内行”的意思,是著名Apache公司下基于Java开发的开源项目。 2.Maven项目对象模型(POM)是一..

bakelFF的博客 12万+

Django进阶:用户认证、REST API与Celery异步任务全解析

在掌握了Django基础开发后,如何构建更强大、更专业的Web应用?本文将带你深入Django的三大高级特性:allauth用户认证系统、DRF(Django REST framework)API开发,以及Celery异步任务处理。这些技术栈是构建现代Web应用的利器,也是面试中的高频考点。

qq_57755194的博客 1286

【STM32+K210项目】基于K210智能人脸识别+车牌识别系统(完整工程资料源码)

随着时代的进步和科技的迅猛发展,人们对居住安全的重视程度不断提升,对安全防范系统的需求也日益增强。在安防系统中,门禁系统占据着重要的位置。传统的门禁控制方式主要依靠钥匙、密码和门禁卡等,这些方式易于被破解和复制,安全性较低。然而,近年来,生物识别技术的迅速发展和成熟,为解决这一问题提供了新的方案。生物识别技术具备便携性、非易失性、不易遗忘以及难以盗用等优点,逐渐被引入到门禁系统中。传统的小区门禁系统往往依赖人工管理,存在一定的局限性,难以满足用户多样化的需求,也浪费了人力资源。

嵌入式技术开发 1万+

windows 配置 libxml2

路径:\libiconv-1.9.2-1-src.zip\src\libiconv\1.9.2\libiconv-1.9.2\include\。执行完后,在当前win32目录中会生成了一个bin.msvc目录,其中就有开发需要的libxml2.lib和libxml2.dll文件。将 libiconv.la 复制到 新建的 lib 目录,并将其改名为 iconv.lib。路径:libiconv-1.9.2-1-bin.zip\lib\。将如下的 iconv.h 复制到新建的 include 目录。

SHELLCODE_8BIT的博客 3884

django+celery异步发送邮件

实现结果:点击发送邮件交给celery处理,减少页面响应时间 celery_send ├── __init__.py ├── __pycache__ │ ├── __init__.cpython-37.pyc │ ├── celery.cpython-37.pyc │ ├── celeryconfig.cpython-37.pyc │ └── tasks.cpython-37.py...

qq_41661056的博客 565

【WorkBuddy从入门到精通实战教程】使用手册 第 1 章 初识 WorkBuddy

腾讯推出全场景AI办公助手WorkBuddy,突破传统聊天机器人局限,实现从需求理解到结果交付的全流程自动化。该工具通过自然语言交互,可自主规划执行复杂任务,包括文件处理、数据分析、PPT制作等,支持多模型切换和技能扩展。内置权限管控机制确保本地文件操作安全,显著降低人工切换工具的成本,提升职场效率。

企鹅码农的专属播客,分享10多年的实战案例和经验解读,包含YOLO、RT-DETR、AI等各个工作领域。 1277

异步任务利器Celery(一)介绍

django项目开发中遇到过一些问题,发送请求后服务器要进行一系列耗时非常长的操作,用户要等待很久的时间。可不可以立刻对用户返回响应,然后在后台运行那些操作呢? crontab定时任务很难达到这样的要求 ,异步任务是很好的解决方法,有一个使用python写的非常好用的异步任务工具Celery。 broker、worker和backend Celery的架构由三部分组成,消息中间件(broke

zhangjunqis的博客 563

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

基于(Flask+)Celery+SQLalchemy的定时任务工具

引言 熟悉Python Web开发的朋友都知道,Celery是编写后台任务的利器。比如一个Web网站在用户注册后需要发送邮箱认证,则可以使用Celery编写一个发送邮件的task异步发送邮件,而不需要在请求上下文那里阻塞,或者起一个线程。 那么,除了以上应用场景,我们还有一个场景是——定时任务。而Celery自带的定时任务功能,配置后是需要重启Celery才能启动的(最新版可能不需要了),而且配置...

代码就是生产力!https://yannanxiu.cn/ 6550

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

使用Celery加速Django数据导入导出的高效方案:django-import-export-celery

使用Celery加速Django数据导入导出的高效方案:django-import-export-celery 1、项目介绍 django-import-export-celery 是一个针对Django应用的利器,它能帮助你在Celery后台异步处理耗时的数据导入和导出任务。这个库提供了一种优雅的方式,使得在大规模数据操作时保持应用程序的响应速度,避免因为长时间运行的任务阻塞UI。 2、项目技术...

gitblog_00098的博客 517

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

推荐项目:Django Cacheback —— 异步缓存刷新的利器

推荐项目:Django Cacheback —— 异步缓存刷新的利器 1、项目介绍 在快速发展的Web应用中,高效的缓存管理是提升性能的关键之一。Django Cacheback 是一个为Django框架设计的异步缓存刷新库,它保证了即使数据过期,也能以最小的延迟提供服务,而不会阻塞响应过程。 2、项目技术分析 Cacheback 的核心理念是使用 Celery 或 rq(结合 django-rq...

gitblog_00033的博客 490
上一篇: rdhbygb
下一篇: java求鸡兔同笼问题
linux12a
博客等级 码龄9年 20粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值