在Flask中使用Celery完成异步和定时任务(Flask、Celery、Redis)

编程目标

通过使用Flask和Celery,实现一个简单的Web应用程序,能够接收HTTP POST请求,并异步发送电子邮件。

说明

  1. 使用Flask创建一个简单的Web应用程序,包含一个HTTP POST路由,用于接收发送电子邮件的请求。
  2. 使用Celery实现一个异步任务,用于发送电子邮件。
  3. 发送电子邮件的请求应包含以下信息:
    • 收件人地址
    • 邮件主题
    • 邮件内容
  4. 邮件发送成功后,返回响应表示成功发送。

技术栈

  • Python
  • Flask
  • Celery
  • Redis

接口设计

1. 发送邮件接口

  • URL: /send-email
  • 方法: POST
  • 请求参数:
    • recipient (string): 收件人地址
    • subject (string): 邮件主题
    • body (string): 邮件内容
  • 成功响应:
    • 状态码: 202 Accepted
    • 响应体: {“message”: “邮件发送任务已启动”}

app.py代码:

from flask import Flask, request, jsonify
from tasks import send_email_asyncapp = Flask(__name__)
app.json.ensure_ascii = False  # 解决中文乱码问题
@app.route('/send-email', methods=['POST'])
def email_sender():post_form_data = request.jsonprint(post_form_data)# 调用异步发送邮件任务email_data = {'sender_email': 'csdn_代码写注释@163.com','sender_password': 'csdn_代码写注释','recipient': post_form_data['recipient'],'subject': post_form_data['subject'],'body': post_form_data['body']}send_email_async.delay(email_data)return jsonify({"message": "邮件发送任务已启动"}), 202if __name__ == "__main__":app.run(debug=True, host='0.0.0.0', port=5000)

tasks.py代码:

from celery import Celery
import smtplib
from email.mime.text import MIMEText
from email.header import Headerapp = Celery('tasks', broker='redis://localhost:6379/0', backend='redis://localhost:6379/0')@app.task
def send_email_async(email_data):content = email_data.get('body')msg_from = email_data.get('sender_email')password = email_data.get('sender_password')msg_to = email_data.get('recipient')subject = email_data.get('subject')msg = MIMEText(content)msg['Subject'] = subjectmsg['From'] = msg_frommsg['To'] = msg_totry:s = smtplib.SMTP_SSL("smtp.163.com", 465)s.login(msg_from, password)s.sendmail(msg_from, msg_to, msg.as_string())s.quit()print('邮件发送成功!')return "邮件发送成功!"except Exception as e:print(f"邮件发送失败: {e}")return "邮件发送失败"

test_send_email.py

import requestssubject = "药价监督流水报告"  # 主题
content = """
尊敬的xxx客户,随函附上本季度药价监督的流水报告。以下是本季度药价监管的关键要点:1. 监督范围:全国23个省市的主要药品批发市场及在线药品交易平台。
2. 检查次数:共计1,536次现场检查和3,245次在线监控。
3. 发现问题:在检查中发现15起价格违规行为,涉及7种药品。
4. 违规处理:所有违规行为均已记录在案,并对相关企业进行了警告及罚款处理。
5. 价格波动:本季度药品平均价格波动率为3.5%,与上季度相比下降了1.2个百分点。2024年05月09日
"""
def send_email():url = 'http://localhost:5000/send-email'  # Flask 应用的 URLdata = {'recipient': 'csdn_代码写注释@qq.com',  # 收件人地址'subject': subject,  # 邮件主题'body': content  # 邮件内容}# 发送 POST 请求response = requests.post(url, json=data)# 输出响应内容print('响应状态码是:', response.status_code)print('响应内容是:', response.text)send_email()

实现效果:
在这里插入图片描述
在这里插入图片描述
requirements.txt:

amqp==5.2.0
async-timeout==4.0.3
billiard==4.2.0
blinker==1.8.2
celery==5.4.0
certifi==2024.2.2
charset-normalizer==3.3.2
click==8.1.7
click-didyoumean==0.3.1
click-plugins==1.1.1
click-repl==0.3.0
colorama==0.4.6
dnspython==2.6.1
eventlet==0.36.1
Flask==3.0.3
Flask-Mail==0.9.1
greenlet==3.0.3
idna==3.7
itsdangerous==2.2.0
Jinja2==3.1.4
kombu==5.3.7
MarkupSafe==2.1.5
prompt-toolkit==3.0.43
python-dateutil==2.9.0.post0
redis==5.0.4
requests==2.31.0
six==1.16.0
tzdata==2024.1
urllib3==2.2.1
vine==5.1.0
wcwidth==0.2.13
Werkzeug==3.0.3

如何启动程序?

# step:0
新建虚拟环境
# step:1
pip install -r requirements.txt
# step:2
启动Redis服务
# 见第一张图片,分别打开三个窗口
窗口1:app
在这个窗口里运行命令:
python app.py窗口2:tests
在这个窗口里运行命令:
python test_send_email.py窗口3:Celery
在这个窗口里运行命令:
celery -A tasks  worker --pool=solo --loglevel=info

然后你把代码里的发送方邮箱、发送方密码(注意是授权码)、接收方邮箱这三个配置参数改成真实的,即可运行本程序实现Celery完成异步发送邮件了。

愿你的努力,被世界看到。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/834700.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

离心式冷水机组的控制逻辑

1)冷冻水泵启停控制 机组处于停机状态下启动机组时,冷冻水泵相对于油泵提前 5 分钟启动,在机组开机状态下 (包括待机),冷冻水泵一直处于开机状态,机组正常关机后,冷冻水泵相对于主电…

基于Spring Boot的酒店管理系统设计与实现

基于Spring Boot的酒店管理系统设计与实现 开发语言:Java 框架:springboot JDK版本:JDK1.8 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea 系统部分展示 系统首页界面图,在系统首页可以查看首页…

java io包

InputStream InputStream 是 Java I/O 中所有输入流的抽象基类,它定义了读取字节流的基本方法。InputStream 类提供了许多子类,用于从不同的数据源读取数据,如文件、网络连接、内存等。 InputStream 提供了以下常用的方法: int…

Spring Data JPA 与 MyBatisPlus的比较

前言 JPA(Java Persistence API)和MyBatis Plus是两种不同的持久化框架,它们具有不同的特点和适用场景。 JPA是Java官方的持久化规范,它提供了一种基于对象的编程模型,可以通过注解或XML配置来实现对象与数据库的映射…

如何给网页添加一个炫酷鼠标点击特效,鼠标特效源码分享(更多特效持续收集中...)

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 鼠标特效 📒📝 火花特效🎈 源码📝 爱心特效🎈 源码📝 彩球爆炸特效🎈 源码📝 更多特效📖 介绍 📖 你是否厌倦了平淡无奇的网页交互?是否渴望为你的网站增添一抹亮色?本文将持续更新,与大家分享收集到的前…

区块链 | NFT 相关论文:Preventing Content Cloning in NFT Collections(二)

🐶原文: Preventing Content Cloning in NFT Collections 🐶写在前面: 这是一篇 2023 年的 CCF-C 类,本博客只记录其中提出的方法。 F C o l l N F T \mathbf{F_{CollNFT}} FCollNFT​ and ERC-721 NFTs 在以太坊这样…

【数学建模】天然肠衣搭配问题衍生问题/线性规划限制条件建立问题

线性规划限制条件建立问题 前景回顾/提出问题回顾1回顾2/问题提出解决前提 解决方法坐标轴(区间)法总结 前景回顾/提出问题 回顾1 首先回顾一下DVD在线租赁问题 在 question2中,需要保证每个人都不会收到自己不喜欢的DVD,即客户在线订单数为0时候&…

Oracle中long和clob的区别和例子

在Oracle数据库中,LONG和CLOB(Character Large Object)都是用于存储大量字符数据的类型,但它们之间存在一些关键的区别。 存储方式: LONG:是以行存储的形式存储在数据行中的。当查询涉及到LONG列时&#…

umi6.x + react + antd的项目增加403(无权限页面拦截),404,错误处理页面

首先在src/pages下创建403&#xff0c;404&#xff0c;ErrorBoundary 403 import { Button, Result } from antd; import { history } from umijs/max;const UnAccessible () > (<Resultstatus"403"title"403"subTitle"抱歉&#xff0c;您无权…

进度条(小程序)

缓冲区的概念 缓冲区是内存中的一个临时存储区域&#xff0c;用来存放输入或输出数据。在标准 I/O 库中&#xff0c;缓冲区的使用可以提高数据处理的效率。例如&#xff0c;当向终端输出文本时&#xff0c;字符通常存储在缓冲区中&#xff0c;直到缓冲区满或者遇到特定条件时才…

FFmpeg开发笔记(二十六)Linux环境安装ZLMediaKit实现视频推流

《FFmpeg开发实战&#xff1a;从零基础到短视频上线》一书在第10章介绍了轻量级流媒体服务器MediaMTX&#xff0c;通过该工具可以测试RTSP/RTMP等流媒体协议的推拉流。不过MediaMTX的功能实在是太简单了&#xff0c;无法应用于真实直播的生产环境&#xff0c;真正能用于生产环境…

HarmonyOS开发之ArkTS使用:新建活动页面

目录 目录 引言 关于ArkTS 开发环境准备 新建项目 新建活动页面 编写ArkTS代码 注册页面 运行应用 最后 引言 随着HarmonyOS&#xff08;鸿蒙操作系统&#xff09;的不断发展&#xff0c;越来越多的前端开发者投入到这个全新的生态系统中。而在HarmonyOS的开发中&…

自我模拟面试

在面试中&#xff0c;你如何面对面试官呢&#xff1f; 我认为&#xff0c;对于面试官提出的问题&#xff0c;如果你不会&#xff0c;那就是不会。你的思考过程&#xff0c;实际上就是将你平时所学的&#xff0c;所了解的&#xff0c;在脑海中进行一次复习&#xff0c;就像当别…

线上副业新选择:宅家工作,4个项目助力增收!

在这个繁华世界&#xff0c;财富与智慧并驾齐驱。越来越多的人意识到&#xff0c;除了主业外&#xff0c;开拓一份副业是实现财富增长的重要途径。在此&#xff0c;我为大家精心挑选了几个值得一试的网上赚钱副业。 1&#xff0c;参与网络调查与问卷填写 随着大数据时代的到来…

[大师C语言(第三篇)]C语言函数参数背后的秘密

C语言函数参数背后的秘密&#xff08;一&#xff09; 在C语言中&#xff0c;函数是执行特定任务的一段代码&#xff0c;可以通过参数传递数据。函数参数是C语言中非常基本且重要的概念&#xff0c;但它们背后的技术原理可能并不为人所熟知。本文将深入探讨C语言函数参数的技术…

kkkkkkkkkkkk564

欢迎关注博主 Mindtechnist 或加入【Linux C/C/Python社区】一起探讨和分享Linux C/C/Python/Shell编程、机器人技术、机器学习、机器视觉、嵌入式AI相关领域的知识和技术。 人工智能与机器学习 &#x1f4dd;人工智能相关概念☞什么是人工智能、机器学习、深度学习☞人工智能发…

UINXU

进入选项字节配置界面之后&#xff0c;从上到下框选的部分依次是读保护、用户配置部分、自定义的两个字节和写保护&#xff0c;这四个部分的配置也是可以直接点击就可以配置。 写保护点一下是四页同时打钩&#xff0c;对应选项字节里的一个位配置4个闪存页 配置完成之后点击…

YOLOv8 Tensorrt Python/C++部署详解

按照大佬的方法进行部署&#xff0c;但是中间出现了很多问题&#xff0c;这里进行一下总结。 YOLOv8 Tensorrt Python/C部署教程_yolo 安装tensorrt-CSDN博客https://blog.csdn.net/weixin_45747759/article/details/130341118 Monday-Leo/Yolov5_Tensorrt_Win10: A simple i…

Kafka从0到消费者开发

安装ZK Index of /zookeeper/zookeeper-3.9.2 下载安装包 一定要下载-bin的&#xff0c;不带bin的是源码&#xff0c;没有编译的&#xff0c;无法执行。-bin的才可以执行。 解压 tar -zxvf apache-zookeeper-3.9.2-bin.tar.gz 备份配置 cp zoo_sample.cfg zoo_sample.cfg-b…

物流集成商巨头-员工薪酬PK:今天国际、音飞存储,诺力股份

语 大家好&#xff0c;我是智能仓储物流技术研习社的社长&#xff0c;老K。专注分享智能仓储物流技术、智能制造等内容。 新书《智能物流系统构成与技术实践》 以下内容为根据上市财报和公开数据整理&#xff0c;若有偏差&#xff0c;请联系小编修改。注意&#xff1a;各公司员…