pythonWeb框架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)

最后view使用信号调用app的函数:

@user.route(‘/sendsync/‘)
def send_sync_mail():
    msg = Message(subject="Hello World!",
                  sender="[email protected]",
                  recipients=["[email protected]"])
    msg.body = "测试异步发送"
    msg.html = "<h2>测试异步发送</h2>"
    thr = Thread(target=signal.send, args=[msg,])
    thr.start()
    return "ok"

最后测试成功:

这里还可以使用sender只接受指定参数,比如:

只有当参数是2时候,才会进入round_two方法

pythonWeb框架flask中使用blinker信号机制解耦业务代码解决ImportError: cannot import name 'app',以异步发送邮件为例

原文地址:https://www.cnblogs.com/houzheng/p/10990372.html

时间: 2024-08-01 09:15:40

pythonWeb框架flask中使用blinker信号机制解耦业务代码解决ImportError: cannot import name 'app',以异步发送邮件为例的相关文章

flask中的session

简述session,cookie session  :  session和cookie的作用类似,都是为了 存储用户有关的信息,不同的是,cookie是村塾在本地浏览器,session是存储在服务器.存储在服务器的数据相对来说更加安全,不容易被窃取.但储存在服务器有一定的弊端,就是会占用服务器的资源,但现在服务器发展至今,一些session信息还是绰绰有余的. 好处:敏感数据不是直接发给浏览器,而是发送回一个session_id,服务器将session_id和敏感数据做一个映射存储在sessio

《开源框架那点事儿16》:缓存相关代码的演变

目录(?)[+] 需求整理 解决思路 具体实现 问题引入 上次我参与某个大型项目的优化工作,由于系统要求有比较高的TPS,因此就免不了要使用缓冲. 该项目中用的缓冲比较多,有MemCache,有Redis,有的还需要提供二级缓冲,也就是说应用服务器这层也可以设置一些缓冲. 当然去看相关实现代代码的时候,大致是下面的样子. [java] view plaincopyprint? public void saveSomeObject(SomeObject someObject){ MemCacheU

flask框架----整合Flask中的目录结构

一.SQLAlchemy-Utils 由于sqlalchemy中没有提供choice方法,所以借助SQLAlchemy-Utils组件提供的choice方法 import datetime from sqlalchemy import create_engine from sqlalchemy.ext.declarative import declarative_base from sqlalchemy import Column, Integer, String, Text, ForeignK

七十三:flask信号之信号机制和使用场景

若安装flask是未默认安装blinker,则pip install blinker 使用信号分为3步,第一是定义一个信号,第二是监听一个信号,第三是发送一个信号 1.定义信号:定义信号需要使用到blinker.Namespace来创建一个命名空间 from blinker import Namespace name_space = Namespace() login_signal = name_space.signal('login') # 为了解决防止多人开发的时候,信号名字冲突的问题 2.

浅谈Linux中的信号机制(二)

首先谢谢 @小尧弟 这位朋友对我昨天夜里写的一篇<浅谈Linux中的信号机制(一)>的指正,之前的题目我用的“浅析”一词,给人一种要剖析内核的感觉.本人自知功力不够,尚且不能对着Linux内核源码评头论足.以后的路还很长,我还是一步一个脚印的慢慢走着吧,Linux内核这座山,我才刚刚抵达山脚下. 好了,言归正传,我接着昨天写下去.如有错误还请各位看官指正,先此谢过. 上篇末尾,我们看到了这样的现象:send进程总共发送了500次SIGINT信号给rcv进程,但是实际过程中rcv只接受/处理了1

浅析Linux中的信号机制(一)

有好些日子没有写博客了,自己想想还是不要荒废了时间,写点儿东西记录自己的成长还是百利无一害的.今天是9月17号,暑假在某家游戏公司实习了一段时间,做的事情是在Windows上用c++写一些游戏英雄技能的逻辑实现.虽然时间不算长,但是也算学了一点东西,对团队项目开发流程也有了一个直观的感受,项目里c++11新特性也有用到不少,特别是lambda表达式,STL的一些容器和算法也终于有了可以实践的地方.由于自己比较喜欢Linux C,也就没有做留下的打算,现在回到了学校,好好复习一段时间,准备一下校招

多线程中的信号机制--signwait()函数【转】

本文转载自:http://blog.csdn.net/yusiguyuan/article/details/14237277 在Linux的多线程中使用信号机制,与在进程中使用信号机制有着根本的区别,可以说是完全不同.在进程环境中,对信号的处理是,先注册信号处理函数,当信号异步发生时,调用处理函数来处理信号.它完全是异步的(我们完全不知到信号会在进程的那个执行点到来!).然而信号处理函数的实现,有着许多的限制:比如有一些函数不能在信号处理函数中调用:再比如一些函数read.recv等调用时会被异

Linux内核中的信号机制--一个简单的例子【转】

本文转载自:http://blog.csdn.net/ce123_zhouwei/article/details/8562958 Linux内核中的信号机制--一个简单的例子 Author:ce123(http://blog.csdn.NET/ce123) 信号机制是类UNIX系统中的一种重要的进程间通信手段之一.我们经常使用信号来向一个进程发送一个简短的消息.例如:假设我们启动一个进程通过socket读取远程主机发送过来的网络数据包,此时由于网络因素当前主机还没有收到相应的数据,当前进程被设置

Python框架学习之Flask中的常用扩展包

Flask框架是一个扩展性非常强的框架,所以导致它有非常多的扩展包.这些扩展包的功能都很强大.本节主要汇总一些常用的扩展包. 一. Flask-Script pip install flask-script 作用: 1. 可以让我们通过命令行的方式启动服务器,还可以手动指定参数,如ip,port. python hello.py runserver -h 127.0.0.1 -p 6666 2. 结合Flask-Migration扩展包可以实现对数据的迁移 二. Flask-WTF 作用是为了能