Flask--信号 blinker

Flask框架中的信号基于blinker,可以让开发者在flask请求过程中 定制一些用户行为执行。

在请求前后,模板渲染前后,上下文前后,异常 的时候

安装:

pip install blinker

1 Flask的内置信号:

    内部通过 send方法 触发信号

    2     request_started = _signals.signal('request-started')  # 请求到来前执行
5 request_finished = _signals.signal('request-finished') # 请求结束后执行 3 before_render_template = _signals.signal('before-render-template') # 模板渲染前执行
4 template_rendered = _signals.signal('template-rendered') # 模板渲染后执行 0 got_request_exception = _signals.signal('got-request-exception') # 请求执行出现异常时执行 6 request_tearing_down = _signals.signal('request-tearing-down') # 请求执行完毕后自动执行(无论成功与否)
7 appcontext_tearing_down = _signals.signal('appcontext-tearing-down') # 请求上下文执行完毕后自动执行(无论成功与否) 1 appcontext_pushed = _signals.signal('appcontext-pushed') # 请求上下文push时执行,一般用不到
8 appcontext_popped = _signals.signal('appcontext-popped') # 请求上下文pop时执行 message_flashed = _signals.signal('message-flashed') # flash消息的时候-- 调用flask在其中添加数据时,自动触发

补充:Django的信号

Model signals      # ORM 操作的时候触发

    pre_init                    # django的modal执行其构造方法前,自动触发
post_init # django的modal执行其构造方法后,自动触发
pre_save # django的modal对象保存前,自动触发
post_save # django的modal对象保存后,自动触发
pre_delete # django的modal对象删除前,自动触发
post_delete # django的modal对象删除后,自动触发
m2m_changed # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
class_prepared # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发 Management signals pre_migrate # 执行migrate命令前,自动触发
post_migrate # 执行migrate命令后,自动触发 Request/response signals request_started # 请求到来前,自动触发
request_finished # 请求结束后,自动触发
got_request_exception # 请求异常后,自动触发 Test signals setting_changed # 使用test测试修改配置文件时,自动触发
template_rendered # 使用test测试渲染模板时,自动触发 Database Wrappers connection_created # 创建数据库连接时,自动触发

使用:

from django.core.signals import request_finished
from django.core.signals import request_started
from django.core.signals import got_request_exception from django.db.models.signals import class_prepared
from django.db.models.signals import pre_init, post_init
from django.db.models.signals import pre_save, post_save
from django.db.models.signals import pre_delete, post_delete
from django.db.models.signals import m2m_changed
from django.db.models.signals import pre_migrate, post_migrate from django.test.signals import setting_changed
from django.test.signals import template_rendered from django.db.backends.signals import connection_created def callback(sender, **kwargs):
print("xxoo_callback")
print(sender,kwargs) 信号.connect(callback)

自定义信号

a. 定义信号

    import django.dispatch
pizza_done = django.dispatch.Signal(providing_args=["toppings", "size"]) b. 注册信号 def callback(sender, **kwargs):
print("callback")
print(sender,kwargs) pizza_done.connect(callback) c. 触发信号 from 路径 import pizza_done pizza_done.send(sender='seven',toppings=123, size=456)

2 特殊装饰器 与 信号的区别

信号的功能 都可以 通过扩展实现

区别:

    1  返回值:注册到信号的函数,没有返回值, 只执行自定义操作

    2  自定义信号,可以降低代码的耦合

3 自定义信号的实现:( 发送消息 )

def QQ(*args,**kwargs):
pass def WX(*args,**kwargs):
pass from flask.signals import _signals MSG = _signals.signal('MSG') # 创建信号
MSG.connect(QQ) # 注册
MSG.connect(WX) @app.route('/',methods=['GET','POST'],endpoint='index')
def index():
MSG.send(sender='xxx',a=1,b=2) # 触发
return render_template('login.html') if __name__ == '__main__':
app.run()

使用例子:

关于请求进来 >>.先执行 扩展的装饰器 before_first_request >> 然后request_start信号 >> 然后 before_request , 然后视图

@app.before_first_request
def sayhello():
print('hello11') def test(*args,**kwargs):
print('test22') from flask.signals import request_started request_started.connect(test) @app.route('/',methods=['GET','POST'],endpoint='index')
def index():
return 'hello333' if __name__ == '__main__':
app.run()

最新文章

  1. 在线音乐网站【03】Part one 功能实现
  2. swift 获取控件位置 大小
  3. 繁华模拟赛 David与Vincent的博弈游戏
  4. Vue.2.0.5-生产环境部署
  5. Feistel密码结构
  6. 开源项目:windows下使用MinGW+msys编译ffmpeg
  7. [转] Web 前端优化最佳实践之 Mobile(iPhone) 篇
  8. [杂题]URAL2047. Maths
  9. Oracle OCI-22053:溢出错误解决方法
  10. Velocity中避免null引起的数据问题
  11. 编程实现Windows系统自动登录
  12. shell运算符之 关系运算符,算数运算符,布尔运算符,字符串运算符和文件测试运算符
  13. 兼容低版本JS的Array.map方法
  14. Linux 开机启动顺序_005
  15. PLSQL入门:cursor传参,loop fetch使用,if使用,单引号字符表示
  16. 一起学习MVC(1)初步了解MVC
  17. BZOJ2034 【2009国家集训队】最大收益
  18. Python 的时间格式化
  19. [Swift]遍历集合类型(数组、集合和字典)
  20. png的故事:隔行扫描算法

热门文章

  1. Mark一下 mysql 误删除root用户的解决方法
  2. 并行求pi (C++实现)
  3. 3 TensorFlow入门之识别手写数字
  4. python并发编程之IO模型(Day38)
  5. Xamrin开发安卓笔记(三)
  6. python中数据类型转换
  7. 一个linux命令(6/13):traceroute命令
  8. 数字图像处理,图像锐化算法的C++实现
  9. CSS3 3D旋转动画菜单
  10. Python 面向对象的三大特性:封装,继承,多态