flask使用blinker信号机制解耦业务代码解决ImportError: cannot import name 'app',以异步发送邮件为例
百度了大半天,不知道怎么搞,直到学习了blinker才想到解决办法,因为之前写java都是文件分开的,
所以发送邮件业务代码也放到view里面,但是异步线程需要使用app,蛋疼的是其他模块不能从app.py导入任何变量:
即:
app.py是主文件,view.py是业务文件, 我需要在view中使用app中的变量,怎么办,百度了很多,没有找到方法
这里可以用信号实现,先记录一下:
python3内置了blinker,可以直接使用,首先在view里定义信号:
然后在app.py里面连接需要使用的函数(这个函数需要使用app,所以只能写在appp.py里),app是可以导入其他模块的变量的:
- # Flask-Mail 中的 send() 函数使用 current_app ,因此必须激活程序上下文。
- # 不过,在不同线程中执行 mail.send() 函数时,程序上下文要使用 app.app_context() 人工创建
- def send_async_email(msg):
- print("---开始发送---")
- with app.app_context():
- mail.send(msg)
- # 导入view 的信号量,并连接异步发送函数
- signal.connect(send_async_email)
- # 高版本可以直接通过注解实现
- # Flask-Mail 中的 send() 函数使用 current_app ,因此必须激活程序上下文。
# 不过,在不同线程中执行 mail.send() 函数时,程序上下文要使用 app.app_context() 人工创建
@signal.connect # 可以直接通过注解绑定函数
def send_async_email(msg):
print("---开始发送---")
with app.app_context():
mail.send(msg)
最后view使用信号调用app的函数:
- @user.route('/sendsync/')
- def send_sync_mail():
- msg = Message(subject="Hello World!",
- sender="799827577@qq.com",
- recipients=["799827577hou@gmail.com"])
- msg.body = "测试异步发送"
- msg.html = "<h2>测试异步发送</h2>"
- thr = Thread(target=signal.send, args=[msg,])
- thr.start()
- return "ok"
最后测试成功:
这里还可以使用sender只接受指定参数,比如:
只有当参数是2时候,才会进入round_two方法
flask使用blinker信号机制解耦业务代码解决ImportError: cannot import name 'app',以异步发送邮件为例的更多相关文章
- 从spring源码汲取营养:模仿spring事件发布机制,解耦业务代码
前言 最近在项目中做了一项优化,对业务代码进行解耦.我们部门做的是警用系统,通俗的说,可理解为110报警.一条警情,会先后经过接警员.处警调度员.一线警员,警情是需要记录每一步的日志,是要可追溯的,比 ...
- Flask笔记:信号机制
Flask中有内置的一些信号,也可以通过三方库blinker自定义信号,其实Flask内置的信号也是优先使用的blinker库,如果没有安装blinker才会使用自定义的信号机制.可以通过点击任意导入 ...
- jdk1.7推出的Fork/Join提高业务代码处理性能
jdk1.7推出的Fork/Join提高业务代码处理性能 jdk1.7之后推出了Fork/Join框架,其原理个人理解为:递归多线程并发处理业务代码,以下为我模拟我们公司业务代码做的一个案例,性能可提 ...
- Inside Flask - signal 信号机制
Inside Flask - signal 信号机制 singal 在平常的 flask web 开发过程中较少接触到,但对于使用 flask 进行框架级别的开发时,则必须了解相关的工作机制.flas ...
- 了解Flask 信号机制
Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为. pip3 install blinker 1. 内置信号 request_started = ...
- 七十三:flask信号之信号机制和使用场景
若安装flask是未默认安装blinker,则pip install blinker 使用信号分为3步,第一是定义一个信号,第二是监听一个信号,第三是发送一个信号 1.定义信号:定义信号需要使用到bl ...
- flask,scrapy,django信号
简介 Django.Flask.scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒. 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒 ...
- Flask学习【第6篇】:Flask中的信号
实例化补充 instance_path和instance_relative_config是配合来用的.这两个参数是用来找配置文件的,当用app.config.from_pyfile('settings ...
- Flask【第6篇】:Flask中的信号
补充的flask实例化参数以及信号 一.实例化补充 instance_path和instance_relative_config是配合来用的.这两个参数是用来找配置文件的,当用app.config.f ...
随机推荐
- codefoces 22E 图论
有些题还得练练模拟的能力呀 这题一言难尽,他给的 图不是半连通子图呀,我崩溃了 要分好组,然后1给2连,2给3连,.....n给1连.. 具体看代码,我写的比较捞了吧.. #include<io ...
- codefoce 782c
好久没有更新了,特地来水一水 简单的涂色问题,大佬说基本都是贪心 #include<cstdio> #include<iostream> #include<vector& ...
- Python简介及学习
Python简介 Python是著名的“龟叔”Guido van Rossum在1989年圣诞节期间,为了打发无聊的圣诞节而编写的一个编程语言. 现在,全世界差不多有600多种编程语言,但流行的编程语 ...
- HTTP 安全头配置
在本篇中,我将介绍常用的安全头信息设置,并对每个响应头设置给出一个示例. HTTP安全头说明 Content-Security-Policy 内容安全策略(CSP)常用来通过指定允许加载哪些资源来防止 ...
- Spring 资源注入
Spring开发中经常需要调用各种资源,包含普通文件.网址.配置文件.系统环境变量等,我们可以使用Spring表达式语言(Spring-EL)实现资源的注入. Spring主要使用@Value注解实现 ...
- wow.js 使用及效果列表
. 基本的样式列表 具体想要什么效果官网查看就行,https://daneden.github.io/animate.css/ 当然还有几个具体的方法,就是控制移入移出的时间,如下图.
- 洛谷P1028 数的计算 题解 动态规划入门题
题目链接:https://www.luogu.com.cn/problem/P1028 题目描述 我们要求找出具有下列性质数的个数(包含输入的自然数 \(n\) ): 先输入一个自然数 \(n(n \ ...
- vue 2.0以上怎么在手机中运行自己的项目
第一步 打开vue项目 第二步 打开项目config/index.js文件,然后找到 module.exports 配置里面的 dev 配置,修改字段host:0.0.0.0 第三步 打开cmd输入i ...
- vue开源Element UI表单设计及代码生成器
在日常的开发工作中,表单开发是较为繁琐且重复的.本文介绍一个我自己写的,提高开发效率的小工具. 1 可视化设计器 设计器基于Element UI ,可通过点击或拖拽的方式设计基本表单, 设计器生成的代 ...
- 现状、趋势如何?——《2019 年度 SaaS 行业【企业愿景】展望 · 总结篇》
SaaS 行业产业地图和行业规模 看完SaaS的概念介绍,聪明的小伙伴们应该都理解了SaaS到底是个什么东西,但TOB的应用一般会离生活比较远,这里直接上产业地图,让大家对常见的SaaS产品有一个直观 ...