在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_async

app = Flask(__name__)
app.json.ensure_ascii = False  # 解决中文乱码问题
@app.route('/send-email', methods=['POST'])
def email_sender():
    post_form_data = request.json
    print(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": "邮件发送任务已启动"}), 202

if __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 Header

app = 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'] = subject
    msg['From'] = msg_from
    msg['To'] = msg_to

    try:
        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 requests

subject = "药价监督流水报告"  # 主题
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 应用的 URL
    data = {
        '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完成异步发送邮件了。

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Java SE】对象的比较

🥰🥰🥰来都来了,不妨点个关注叭! 👉博客主页:欢迎各位大佬!👈 本期内容满满干货,将会深入介绍对象与对象之间是如何进行比较的,我们知道基本数据类型是可以直…

使用 docker-compose 搭建个人博客 Halo

说明 我这里使用的是 Halo 作为博客的工具,毕竟是开源了,也是使用 Java 写的嘛,另外一点就是使用 docker 来安装(自动挡,不用自己考虑太多的环境因素),这样子搭建起来更快一点,我们…

【STM32 |新建一个工程】基于标准库(库函数)新建工程

目录 STM32开发方式 库函数文件夹 建工程步骤 库函数工程建立 建立工程总结 STM32开发方式 目前stm32的开发方式主要有基于寄存器的方式、基于标准库的方式(库函数的方式)、基于HAL库的方式基于库函数的方式是使用ST官方提供的封装好的函数&…

17、线上系统中垃圾回收参数的精准调校指南

17.1、前文回顾 在上一篇文章中,我们已经通过逐步的图解方式,详细解释了CMS垃圾回收的运行机制。简单来说,CMS垃圾回收器采用了四个阶段来进行垃圾回收,以尽量避免长时间的“Stop the World”现象。这四个阶段分别是:初始标记、并发标记、重新标记和并发清理。 在初始标…

AlphaFold 3 可以预测所有生命分子的结构和相互作用

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

《二十二》Qt 音频编程实战---做一个音频播放器

1.UI界面制作 作为一个音乐播放器,最基础的肯定就是播放、暂停、上一首以及下一首,为了使这个界面好看一点,还加入了音量控制、进度条、歌曲列表等内容,至于这种配色和效果好不好看,我也不知道,个人审美一如…

【Java基础】数学相关的方法

基本方法 Return TypeFunctionDescriptionstatic doublerandom()返回值为 double&#xff0c;值为正号&#xff0c; ≥0.0 <1.0static 数值类型abs(数值类型 a)返回值为a的绝对值static doublepow(double a, double b)将第一个参数的值返回到第二个参数的幂static doublesq…

Taro 快速开始

大家好我是苏麟 , 今天聊聊Trao. 官网 : Taro 介绍 | Taro 文档 (jd.com) 点击快速开始 全局安装 CLI 初始化一个项目 选择配置 : 根据自己需求选择 安装失败先不用管 , 用前端工具打开项目 npm install 安装 , 显示安装失败 怎么解决 ? : 查看报错信息 百度 , 问 AI 工具 运…

第十讲:指针(2)

第十讲&#xff1a;指针&#xff08;2&#xff09; 1.对于数组名的理解1.1验证数组名就是数组首元素的地址1.2sizeof数组名和&数组名1.2.1sizeof数组名1.2.2&数组名 2.使用指针访问数组3.数组传参的本质4.冒泡排序5.二级指针6.指针数组7.指针数组模拟二维数组 这一讲讲…

TODESK怎么查看有人在远程访问

odesk怎么查看有人在远程访问 Todesk作为一款远程桌面控制软件&#xff0c;为用户提供了便捷的远程访问与控制功能。但在享受这种便利的同时&#xff0c;许多用户也关心如何确保自己设备的安全&#xff0c;特别是如何知道是否有人在未经授权的情况下远程访问自己的电脑。本文将…

TODESK远程开机的原理

在现代计算机技术飞速发展的背景下&#xff0c;远程控制软件成为我们日常工作中不可或缺的工具。其中&#xff0c;ToDesk作为一款高效且易用的远程控制软件&#xff0c;备受用户青睐。那么&#xff0c;ToDesk远程开机的原理是什么呢&#xff1f;本文将为你揭晓这个秘密。 KKVie…

《TAM》论文笔记(上)

原文链接 [2005.06803] TAM: Temporal Adaptive Module for Video Recognition (arxiv.org) 原文代码 GitHub - liu-zhy/temporal-adaptive-module: TAM: Temporal Adaptive Module for Video Recognition 原文笔记 What&#xff1a; TAM: Temporal Adaptive Module for …

Disk Doctor for Mac 免激活版:数据安全守卫者

数据丢失是每个人都可能遇到的问题&#xff0c;但Disk Doctor for Mac能让这个问题迎刃而解。这款强大的数据恢复软件&#xff0c;能迅速找回因各种原因丢失的数据。 Disk Doctor采用先进的扫描技术&#xff0c;能深入剖析磁盘&#xff0c;找到并恢复被删除或损坏的文件。同时&…

NREL概述了串联电池的前进方向

研究人员表示&#xff0c;串联技术将帮助我们在2050年达到75太瓦的光伏发电量&#xff0c;但行业合作将是关键 美国能源部国家可再生能源实验室&#xff08;NREL&#xff09;的研究人员已经制定了一份路线图&#xff0c;说明如何将串联太阳能电池&#xff08;特别是那些结合了不…

吉林事业编报名照要求<50kb怎么压缩

吉林事业编报名照要求&#xff1c;50kb怎么压缩

如何安装ElasticSearch及相关件

一、简介 ElasticSearch是什么&#xff1f; elasticsearch简写es&#xff0c;es是一个高扩展、开源的全文检索和分析引擎&#xff0c;它可以准实时地快速存储、搜索、分析海量的数据。 ElasticSearch 插件 elasticsearch-head是一款专门针对于elasticsearch的客户端工具&am…

基于FPGA的视频矩阵切换方案

一、单个显示设备的系统方案&#xff1a;会议室只有1个显示设备 会议室的信号源有很多&#xff0c;但是显示设备只有1个&#xff0c;这个时候最佳方案是使用切换器。 &#xff08;1&#xff09;切换器&#xff08;控制方式&#xff1a;遥控器、软件、机箱面板、中控&#xff…

Relaxed MemoryConsistency

SC和TSO都被称之为强&#xff08;strong&#xff09;保序模型&#xff1b; because the global memory order of each model usually respects (preserves) per-thread program order&#xff1b;回想一下&#xff0c;对于load和store的所有四种组合&#xff08;Load -> Lo…

FPGA+HDMI转换方案,用于网络直播切换直播画面,客户应用:直播,自媒体

FPGAHDMI转换方案&#xff0c;用于网络直播切换直播画面 客户应用:直播&#xff0c;自媒体 主要功能: 1.支持多路HDMI高清输入/输出 2.支持各路输入输出灵活切换 3.支持USB接口 4.支持网口 5.支持音频输出接口 6.支持serders

使用nvm安装node.js过程

今天Jade尝试安装nvm&#xff0c;并使用命令安装node.js但是碰到了一些问题&#xff0c;在此作为学习记录分享出来。希望可以留下深刻的印象&#xff1a; 1、概念了解 nvm----- (Node.js version manager)是一个命令行应用&#xff0c;可以协助您快速地 更新、安装、使用、卸载…