当前位置: 首页 > news >正文

Django框架集成Celery异步-【2】:django集成celery,拿来即用,可用操作django的orm等功能

一、项目结构和依赖

study_celery

          | --user

                |-- models.py

                |--views.py

                |--urls.py

          |--celery_task

                  |--__init__.py

                  |--async_task.py

                  |-- celery.py

                  | --check_task.py

                  | --config.py

                  | --scheduler_task.py

        | --study_celery

                | --settings.py

        | --manage.py

依赖:redis数据库
 

redis==4.6.0
Django==3.2
django-redis==5.3.0
celery==5.3.1

二、celery框架配置详情

1、配置文件

config.py

from celery.schedules import crontab
from datetime import timedelta
'''
参数解析:
accept_content:允许的内容类型/序列化程序的白名单,如果收到不在此列表中的消息,则该消息将被丢弃并出现错误,默认只为json;
task_serializer:标识要使用的默认序列化方法的字符串,默认值为json;
result_serializer:结果序列化格式,默认值为json;
timezone:配置Celery以使用自定义时区;
enable_utc:启用消息中的日期和时间,将转换为使用 UTC 时区,与timezone连用,当设置为 false 时,将使用系统本地时区。
result_expires: 异步任务结果存活时长
beat_schedule:设置定时任务
'''
#手动注册celery的异步任务:将所有celery异步任务所在的模块找到,写成字符串
task_module = ['celery_task.async_task',  # 写任务模块导入路径,该模块主要写异步任务的方法'celery_task.scheduler_task',  # 写任务模块导入路径,该模块主要写定时任务的方法
]#celery的配置
config = {"broker_url" :'redis://127.0.0.1:6379/0',   #'redis://:123456@127.0.0.1:6379/1' 有密码时,123456是密码"result_backend" : 'redis://127.0.0.1:6379/1',"task_serializer" : 'json',"result_serializer" : 'json',"accept_content" : ['json'],"timezone" : 'Asia/Shanghai',"enable_utc" : False,"result_expires" : 1*60*60,"beat_schedule" : { #定时任务配置# 名字随意命名'add-func-30-seconds': {# 执行add_task下的addy函数'task': 'celery_task.scheduler_task.add_func',  # 任务函数的导入路径,from celery_task.scheduler_task import add_func# 每10秒执行一次'schedule': timedelta(seconds=30),# add函数传递的参数'args': (10, 21)},# 名字随意起'add-func-5-minutes': {'task': 'celery_task.scheduler_task.add_func',  # 任务函数的导入路径,from celery_task.scheduler_task import add_func# crontab不传的参数默认就是每的意思,比如这里是每年每月每日每天每小时的5分执行该任务'schedule': crontab(minute='5'),  # 之前时间点执行,每小时的第5分钟执行任务, 改成小时,分钟,秒 就是每天的哪个小时哪分钟哪秒钟执行'args': (19, 22)  # 定时任务需要的参数},# 缓存用户数据到cache中'cache-user-func': {'task': 'celery_task.scheduler_task.cache_user_func',# 导入任务函数:from celery_task.scheduler_task import cache_user_func'schedule': timedelta(minutes=1),  # 每1分钟执行一次,将用户消息缓存到cache中}}
}

2、celery对象创建

celery.py

from celery import Celery
from celery.schedules import crontab
from datetime import timedelta
from .config import config,task_module# 生成celery对象,'task'相当于key,用于区分celery对象
# broker是指定消息处理,backend是指定结果后端的存储位置 include参数需要指定任务模块
app = Celery('task', broker=config.get('broker_url'), backend=config.get('result_backend'), include=task_module)
app.conf.update(**config)

3、异步任务模块

async_task.py

'1、因为需要用到django中的内容,所以需要配置django环境'
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "study_celery.settings")#根目录下study_celery/settings.py
import django
django.setup()# 导入celery对象app
from celery_task.celery import app
# 导入django自带的发送邮件模块
from django.core.mail import send_mail
import threading
from study_celery import settings
from apps.user.models import UserModel
'''
2、异步任务
不保存函数返回值的,@app.task(ignore_result=True)
保存函数返回值的任务,@app.task
'''#没有返回值,禁用掉结果后端
@app.task
def send_email_task(email,code):  # 此时可以直接传邮箱,还能减少一次数据库的IO操作''':param email: 接收消息的邮箱,用户的邮箱:return:'''# 启用线程发送邮件,此处最好加线程池t = threading.Thread(target=send_mail,args=("登录前获取的验证码",  # 邮件标题'点击该邮件激活你的账号,否则无法登陆',  # 给html_message参数传值后,该参数信息失效settings.EMAIL_HOST_USER,  # 用于发送邮件的邮箱地址[email],  # 接收邮件的邮件地址,可以写多个),# html_message中定义的字符串即HTML格式的信息,可以在一个html文件中写好复制出来放在该字符串中kwargs={'html_message': f"<p></p> <p>验证码:{code}</p>"})t.start()return {'email':email,'code':code}@app.task
def search_user_task():users = UserModel.objects.all()lis = []for user in users:dic = {'id':user.id,'name':user.name}lis.append(dic)return {'users':lis}

4、定时任务模块

scheduler_task.py

'1、因为需要用到django中的内容,所以需要配置django环境 '
import os
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "study_celery.settings")#根目录下study_celery/settings.py
import django
django.setup()from celery_task.celery import app
from apps.user.views import models as user_models
from django.core.cache import cache
import time
from django.forms import model_to_dict'2、定时任务'
#有返回值,返回值可以从结果后端中获取
@app.task
def add_func(a,b):print('执行了加法函数')cache.set('add_ret',{'time':time.strftime('%Y-%m-%d %H:%M:%S'),'ret':a+b})return a+b#不需要返回值,禁用掉结果后端
@app.task(ignore_result=True)
def cache_user_func():user = user_models.UserModel.objects.all()user_dict = {}for obj in user:user_dict[obj.account] = model_to_dict(obj)cache.set('all-user-data',user_dict,timeout=35*60)

5、检测任务完成状态

check_task.py

from celery.result import AsyncResult
from celery_task.celery import app
'''验证任务的执行状态的'''def check_task_status(task_id):'''任务的执行状态:PENDING :等待执行STARTED :开始执行RETRY   :重新尝试执行SUCCESS :执行成功FAILURE :执行失败:param task_id::return:'''result = AsyncResult(id=task_id, app=app)dic = {'type':result.status,'msg':'','data':'','code':400}if result.status == 'PENDING':dic['msg'] = '任务等待中'elif result.status == 'STARTED':dic['msg'] = '任务开始执行'elif result.status == 'RETRY':dic['msg']='任务重新尝试执行'elif result.status =='FAILURE':dic['msg'] = '任务执行失败了'elif result.status == 'SUCCESS':result = result.get()dic['msg'] = '任务执行成功'dic['data'] = resultdic['code'] = 200# result.forget() # 将结果删除# async.revoke(terminate=True)  # 无论现在是什么时候,都要终止# async.revoke(terminate=False) # 如果任务还没有开始执行呢,那么就可以终止。return dic

三、django项目的配置

1、settings.py

模块注册

#app注册
INSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles','user.apps.UserConfig',
]#cache缓存
CACHES = {"default": {"BACKEND": "django_redis.cache.RedisCache","LOCATION": "redis://127.0.0.1:6379/2","OPTIONS": {"CLIENT_CLASS": "django_redis.client.DefaultClient","CONNECTION_POOL_KWARGS": {"max_connections": 1000}# "PASSWORD": "123",},'TIMEOUT':30*60 #缓存过期时间}
}#邮件配置
# EMAIL_BACKEND = 'django.core.mail.backends.smtp.EmailBackend'
EMAIL_HOST = 'smtp.qq.com'  # 如果是 163 改成 smtp.163.com
EMAIL_PORT = 465
EMAIL_HOST_USER = 'xxxx@qq.com'  # 发送邮件的邮箱帐号
EMAIL_HOST_PASSWORD = 'xxx'  # 授权码,各邮箱的设置中启用smtp服务时获取
DEFAULT_FROM_EMAIL = EMAIL_HOST_USER
# 这样收到的邮件,收件人处就会这样显示
# DEFAULT_FROM_EMAIL = '2333<'1234567890@qq.com>'
EMAIL_USE_SSL = True   # 使用ssl
# EMAIL_USE_TLS = False # 使用tls
# EMAIL_USE_SSL 和 EMAIL_USE_TLS 是互斥的,即只能有一个为 True

2、关于视图函数的方法

1、获取cache对象,操作cache

from django.core.cache import cache

cache.set(key,value)

cache.get(key)

2、执行异步任务

from celery_task.async_task import send_email_task

res = send_email_task.delay('xxx@qq.com','23456')

task_id = res.id #获取异步任务的id,通过该id可用获取任务的运行状态

from celery_task.async_task import search_user_task
res = search_user_task.delay()

四、启动项目:项目根目录下执行

django项目

python manage.py runserver

celery框架

#windows系统

celery -A celery_task.celery worker -l info  -P  eventlet

#linux系统

celery -A celery_task.celery worker -l info 

定时任务启动

celery -A celery_task beat -l info

五、码云地址

django配置celery: django配置使用celery,django使用celery,django+celeryicon-default.png?t=N7T8https://gitee.com/liuhaizhang/django-configuration-celery

相关文章:

Django框架集成Celery异步-【2】:django集成celery,拿来即用,可用操作django的orm等功能

一、项目结构和依赖 study_celery | --user |-- models.py |--views.py |--urls.py |--celery_task |--__init__.py |--async_task.py |-- celery.py | --check_task.py | --config.py | --scheduler_task.py | --study_celery | --settings.py | --manage.py 依赖&#xff1a…...

获取本地缓存数据修改后,本地缓存中的值也修改问题

获取本地缓存数据修改后&#xff0c;本地缓存中的值也修改问题 JAVA缓存&#xff0c;获取数据后修改&#xff0c;缓存中的数值也会修改&#xff0c;解决方法是创建新的对象再修改值比如使用BeanUtils.copyProperties()方法。如果值是List&#xff0c;可以使用两种方法解决循环…...

云开发校园宿舍/企业/部门/物业故障报修小程序源码

微信小程序云开发校园宿舍企业单位部门物业报修小程序源码&#xff0c;这是一款云开发校园宿舍报修助手工具系统微信小程序源码&#xff0c;适用于学校机房、公司设备、物业管理以及其他团队后勤部&#xff0c;系统为简单云开发&#xff0c;不需要服务器域名即可部署&#xff0…...

K邻近算法(KNN,K-nearest Neighbors Algorithm)

文章目录 前言应用场景欧几里得距离&#xff08;欧氏距离&#xff09;两类、单一属性&#xff08;1D&#xff09;两类、两种属性&#xff08;2D&#xff09;两类、两种以上属性&#xff08;>3D&#xff09; Examples in R再来一个补充一下什么是变量 什么是变量&#xff1f;…...

前端基础一:用Formdata对象来上传图片的原因

最近有人问&#xff1a;你是否能用json来传图片&#xff0c;其实应该这么理解就对了。 一、上传的数据体格式Content-Type 1.application/x-www-form-urlencoded 2.application/json 3.multipart/form-data 以上三种类型旨在告诉服务器需要接收的数据类型同事要…...

CSS的布局 Day03

一、显示模式&#xff1a; 网页中HTML的标签多种多样&#xff0c;具有不同的特征。而我们学习盒子模型、使用定位和弹性布局把内容分块&#xff0c;利用CSS布局使内容脱离文本流&#xff0c;使用定位或弹性布局让每块内容摆放在想摆放的位置&#xff0c;让网站页面布局更合理、…...

nodejs+vue+elementui养老院老年人服务系统er809

“养老智慧服务平台”是运用nodejs语言和vue框架&#xff0c;以MySQL数据库为基础而发出来的。为保证我国经济的持续性发展&#xff0c;必须要让互联网信息时代在我国日益壮大&#xff0c;蓬勃发展。伴随着信息社会的飞速发展&#xff0c;养老智慧服务平台所面临的问题也一个接…...

antd表格宽度超出屏幕,列宽自适应失效

最近遇到个诡异的问题&#xff0c;Table用的好好的&#xff0c;可就有一个页面的表格显示不全&#xff0c;超出浏览器宽&#xff0c;设定表格宽度也没用。 仔细分析了用户上传展示的数据后发现&#xff0c;不自动换行的超宽列都是url地址&#xff0c;一开始还以为是地址里有不…...

布局--QT Designer

一、在我们使用Qt做界面设计时&#xff0c;为了界面的整洁美观&#xff0c;往往需要对界面中的所有控件做一个有序的排列&#xff0c;以及设置各个控件之间的间距等等&#xff0c;为此Qt为界面设计提供了基本布局功能&#xff0c;使用基本布局可以使组件有规则地分布。 1.1 基…...

2024第八届杭州国际智慧城市博览会:建筑与智能,智慧与未来

浙江&#xff0c;中国最具活力的省份之一&#xff0c;将再次迎来一场盛大的智慧城市行业展会。2024年第八届浙江智慧城市博览会&#xff0c;由浙江省土木建筑学会发起主办&#xff0c;以“探索未来&#xff0c;智能引领”为主题&#xff0c;于2024年4月份在美丽的杭州国际博览中…...

Text-to-SQL小白入门(八)RLAIF论文:AI代替人类反馈的强化学习

学习RLAIF论文前&#xff0c;可以先学习一下基于人类反馈的强化学习RLHF&#xff0c;相关的微调方法&#xff08;比如强化学习系列RLHF、RRHF、RLTF、RRTF&#xff09;的论文、数据集、代码等汇总都可以参考GitHub项目&#xff1a;GitHub - eosphoros-ai/Awesome-Text2SQL: Cur…...

C语言联合体和枚举

C语言联合体和枚举 文章目录 C语言联合体和枚举一、联合体①联合体简介②联合体大小的计算 二、枚举 一、联合体 ①联合体简介 union Un {char c;int i; };像结构体一样&#xff0c;联合体也是由⼀个或者多个成员构成&#xff0c;这些成员可以不同的类型。但是编译器只为最大…...

Ubuntu 上传项目到 GitHub

一、前言 GitHub 作为时下最大的开源代码管理项目&#xff0c;广泛被工程和科研人员使用&#xff0c;本文主要介绍如何如何将自己的项目程序上传到 GitHub 上。 要上传本地项目到 GitHub 上&#xff0c;主要分为两步&#xff0c;第一步是 二、创建 SSH keys 首先登录 GitHu…...

CSS 复杂卡片/导航栏特效运用目录

主要是记录复杂卡片/导航栏相关的特效实践案例和实现思路。 章节名称完成度难度文章地址完整代码下载地址多曲面卡片实现完成复杂文章链接代码下载倒置边框半径卡片完成一般文章链接代码下载...

QT: 一种精确定时器类的实现与使用

1&#xff09;类的实现 #ifndef CPRECISETIMER_H #define CPRECISETIMER_H#include <windows.h>class CPreciseTimer { public:CPreciseTimer();bool SupportsHighResCounter();void StartTimer();void StopTimer();__int64 GetTime();private://Auxiliary Functionvoid…...

SQLite4Unity3d安卓 在手机上创建sqlite失败解决

总结 要在Unity上运行一次出现库&#xff0c;再打包进APK内 问题 使用示例代码的创建库 var dbPath string.Format("Assets/StreamingAssets/{0}", DatabaseName); #else// check if file exists in Application.persistentDataPathvar filepath string.Format…...

跨站请求伪造:揭秘攻击与防御

1、什么是CSRF 其目标是在用户不知情的情况下&#xff0c;以用户身份执行未经授权的操作。攻击者通过引诱用户访问恶意网站或点击包含恶意代码的链接&#xff0c;来伪造一个请求发送给服务器&#xff0c;来触发 CSRF 攻击。一旦用户被攻击&#xff0c;他们的登录凭据将被用于执…...

matlab 图像均值滤波

目录 一、算法原理二、代码实现三、结果展示本文由CSDN点云侠翻译,放入付费专栏只为防不要脸的爬虫。专栏值钱的不是本文,切勿因本文而订阅。 一、算法原理 均值滤波是一种常用的线性滤波方法,用于平滑图像并减少噪声。它的实现过程如下: 确定滤波器的大小:选择一个固定的…...

P1433 吃奶酪

#include <iostream> #include <cmath> using namespace std; #define M 15 #define S(n) ((n) * (n)) double indx[M 5], indy[M 5], ans 0, sum 0;//坐标数组&#xff0c;从下标为1开始记录 int n, vis[M 5] { 0 };//vis数组&#xff0c;选过的数字标记为1…...

c++string类的赋值问题

来看问题&#xff1a; 为什么呢&#xff1f;是因为定义string a""时候a没有占用空间&#xff0c;所以没有a[0],a[1],a[3]。如果说string a"hhhhhh"&#xff0c;那么图中a[0],a[1],a[3]就有效了。正确的做法是用连接&#xff0c;或者是定义时写成string a(6…...

保姆级教程:在RflySim仿真平台用Python玩转大疆Livox激光雷达点云(附完整配置流程)

从零玩转RflySim与大疆Livox激光雷达&#xff1a;Python点云处理全实战指南 当无人机开发者需要测试激光雷达算法时&#xff0c;真实飞行测试成本高昂且风险大。RflySim仿真平台结合大疆Livox激光雷达的虚拟模型&#xff0c;为开发者提供了一个安全、高效的测试环境。本文将手把…...

ESP8266 EEPROM实战:手把手教你存WiFi密码,断电重启也不怕

ESP8266 EEPROM实战&#xff1a;构建可靠的WiFi凭证存储系统 每次重启ESP8266设备都要重新输入WiFi密码&#xff1f;这种重复劳动早就该被技术淘汰了。想象一下&#xff0c;你的智能家居设备在断电恢复后能自动重新连接网络&#xff0c;工业传感器在意外重启后依然保持通信——…...

探索汽车LAR LQG半主动/主动悬架:基于Simulink的奇妙之旅

汽车lar lqg 半主动/主动悬架 simulink在汽车工程领域&#xff0c;悬架系统犹如车辆的“脚”&#xff0c;直接影响着行驶的平顺性和安全性。今天咱们就来唠唠汽车的LAR LQG半主动/主动悬架&#xff0c;顺便用Simulink来比划比划。 LAR LQG悬架原理简述 LAR&#xff08;Linear …...

VASP表面建模进阶:利用现代脚本工具实现Slab模型原子选择性固定(POSCAR高效处理)

1. 为什么需要自动化处理POSCAR文件 在计算材料学领域&#xff0c;VASP作为第一性原理计算的黄金标准工具&#xff0c;其输入文件POSCAR的准确性直接决定了计算结果的可靠性。传统手动处理方式存在几个致命缺陷&#xff1a;首先&#xff0c;用Excel手工标记原子固定状态极易出错…...

Midscene.js:重塑UI自动化的革命性AI视觉驱动方案

Midscene.js&#xff1a;重塑UI自动化的革命性AI视觉驱动方案 【免费下载链接】midscene AI-powered, vision-driven UI automation for every platform. 项目地址: https://gitcode.com/GitHub_Trending/mid/midscene 你是否曾为编写复杂的UI自动化脚本而头疼&#xff…...

JavaSE从0到1-DAY7-内部类(i)

Java 内部类学习笔记&#xff08;i&#xff09; 一、为什么会有内部类&#xff1f; 核心作用 内部类是写在外部类里面的类&#xff0c;它的主要作用是&#xff1a; 逻辑封装&#xff1a;把只属于外部类的辅助功能封装起来&#xff0c;不暴露给外界访问权限&#xff1a;内部类可…...

实战演练:基于快马平台开发结合openclaw配置模型的工业分拣模拟系统

最近在做一个工业分拣系统的模拟项目&#xff0c;尝试用openclaw配置模型来实现对不同形状物体的智能抓取。整个过程在InsCode(快马)平台上完成&#xff0c;发现这个工具特别适合快速搭建这类机器人控制原型。记录下具体实现过程&#xff1a; 场景搭建 首先用三维引擎创建了一个…...

Windows双网卡路由配置实战:内外网高效并行访问指南

1. 为什么需要双网卡并行访问内外网&#xff1f; 在企业办公环境中&#xff0c;我们经常遇到这样的场景&#xff1a;电脑需要同时连接内网处理公司业务系统&#xff0c;又要访问外网查询资料或使用云服务。如果频繁切换网络&#xff0c;不仅效率低下&#xff0c;还可能因为操作…...

告别单片机!用Multisim 10.0和74LS192芯片,手把手教你搭一个30秒倒计时器(附完整电路图)

数字电路实战&#xff1a;用Multisim与74LS192打造精准30秒倒计时器 在电子设计领域&#xff0c;倒计时器是一个经典而实用的项目。传统上&#xff0c;许多初学者会直接选择单片机方案&#xff0c;认为编程控制更为简单。但真正理解数字电路的工作原理&#xff0c;掌握硬件层面…...

告别命令行恐惧:FastbootEnhance如何让Android刷机变得像点菜一样简单?

告别命令行恐惧&#xff1a;FastbootEnhance如何让Android刷机变得像点菜一样简单&#xff1f; 【免费下载链接】FastbootEnhance A user-friendly Fastboot ToolBox & Payload Dumper for Windows 项目地址: https://gitcode.com/gh_mirrors/fa/FastbootEnhance 还…...