信号(源码)

信号,是在flask框架中为我们预留的钩子,让我们可以进行一些自定义操作。

  1. pip3 install blinker

根据flask项目的请求流程来进行设置扩展点

1.中间件

  1. from flask import Flask,render_template
  2. app = Flask(__name__)
  3. @app.route('/index')
  4. def index():
  5. return render_template('index.html')
  6. @app.route('/order')
  7. def order():
  8. return render_template('order.html')
  9. class MyMiddleware(object):
  10. def __init__(self,old_app):
  11. self.wsgi_app = old_app.wsgi_app
  12. def __call__(self, *args, **kwargs):
  13. print('123')
  14. result = self.wsgi_app(*args, **kwargs)
  15. print('456')
  16. return result
  17. app.wsgi_app = MyMiddleware(app)
  18. if __name__ == '__main__':
  19. app.run()

2.当app_ctx被push到local中栈之后,会触发appcontext_pushed信号,之前注册在这个信号中的方法,就会被执行。

  1. from flask import Flask,render_template
  2. from flask import signals
  3. app = Flask(__name__)
  4. @signals.appcontext_pushed.connect
  5. def f1(arg):
  6. print('appcontext_pushed信号f1被触发',arg)
  7. @signals.appcontext_pushed.connect
  8. def f2(arg):
  9. print('appcontext_pushed信号f2被触发',arg)
  10. @app.route('/index')
  11. def index():
  12. return render_template('index.html')
  13. @app.route('/order')
  14. def order():
  15. return render_template('order.html')
  16. if __name__ == '__main__':
  17. app.run()
  18. # app.__call__

3.执行before_first_request扩展

  1. from flask import Flask,render_template
  2. app = Flask(__name__)
  3. @app.before_first_request
  4. def f2():
  5. print('before_first_requestf2被触发')
  6. @app.route('/index')
  7. def index():
  8. return render_template('index.html')
  9. @app.route('/order')
  10. def order():
  11. return render_template('order.html')
  12. if __name__ == '__main__':
  13. app.run()

4.request_started信号

  1. from flask import Flask,render_template
  2. from flask import signals
  3. app = Flask(__name__)
  4. @signals.request_started.connect
  5. def f3(arg):
  6. print('request_started信号被触发',arg)
  7. @app.route('/index')
  8. def index():
  9. return render_template('index.html')
  10. @app.route('/order')
  11. def order():
  12. return render_template('order.html')
  13. if __name__ == '__main__':
  14. app.run()

5.url_value_processor

  1. from flask import Flask,render_template,g
  2. from flask import signals
  3. app = Flask(__name__)
  4. @app.url_value_preprocessor
  5. def f5(endpoint,args):
  6. print('f5')
  7. @app.route('/index/')
  8. def index():
  9. print('index')
  10. return render_template('index.html')
  11. @app.route('/order')
  12. def order():
  13. print('order')
  14. return render_template('order.html')
  15. if __name__ == '__main__':
  16. app.run()

6.before_reuqest

  1. from flask import Flask,render_template,g
  2. from flask import signals
  3. app = Flask(__name__)
  4. @app.before_request
  5. def f6():
  6. g.xx = 123
  7. print('f6')
  8. @app.route('/index/')
  9. def index():
  10. print('index')
  11. return render_template('index.html')
  12. @app.route('/order')
  13. def order():
  14. print('order')
  15. return render_template('order.html')
  16. if __name__ == '__main__':
  17. app.run()

视图函数

7.before_render_template / rendered_template

  1. from flask import Flask,render_template,g
  2. from flask import signals
  3. app = Flask(__name__)
  4. @signals.before_render_template.connect
  5. def f7(app, template, context):
  6. print('f7')
  7. @signals.template_rendered.connect
  8. def f8(app, template, context):
  9. print('f8')
  10. @app.route('/index/')
  11. def index():
  12. return render_template('index.html')
  13. @app.route('/order')
  14. def order():
  15. print('order')
  16. return render_template('order.html')
  17. if __name__ == '__main__':
  18. app.run()

8.after_request

  1. from flask import Flask,render_template,g
  2. from flask import signals
  3. app = Flask(__name__)
  4. @app.after_request
  5. def f9(response):
  6. print('f9')
  7. return response
  8. @app.route('/index/')
  9. def index():
  10. return render_template('index.html')
  11. @app.route('/order')
  12. def order():
  13. print('order')
  14. return render_template('order.html')
  15. if __name__ == '__main__':
  16. app.run()

9.request_finished

  1. from flask import Flask,render_template,g
  2. from flask import signals
  3. app = Flask(__name__)
  4. @signals.request_finished.connect
  5. def f10(app,response):
  6. print('f10')
  7. @app.route('/index/')
  8. def index():
  9. return render_template('index.html')
  10. @app.route('/order')
  11. def order():
  12. print('order')
  13. return render_template('order.html')
  14. if __name__ == '__main__':
  15. app.run()

10.got_request_exception

  1. from flask import Flask,render_template,g
  2. from flask import signals
  3. app = Flask(__name__)
  4. @app.before_first_request
  5. def test():
  6. int('asdf')
  7. @signals.got_request_exception.connect
  8. def f11(app,exception):
  9. print('f11')
  10. @app.route('/index/')
  11. def index():
  12. return render_template('index.html')
  13. @app.route('/order')
  14. def order():
  15. print('order')
  16. return render_template('order.html')
  17. if __name__ == '__main__':
  18. app.run()

11.teardown_request

  1. from flask import Flask,render_template,g
  2. from flask import signals
  3. app = Flask(__name__)
  4. @app.teardown_request
  5. def f12(exc):
  6. print('f12')
  7. @app.route('/index/')
  8. def index():
  9. return render_template('index.html')
  10. @app.route('/order')
  11. def order():
  12. print('order')
  13. return render_template('order.html')
  14. if __name__ == '__main__':
  15. app.run()

12.request_tearing_down

  1. from flask import Flask,render_template,g
  2. from flask import signals
  3. app = Flask(__name__)
  4. @signals.request_tearing_down.connect
  5. def f13(app,exc):
  6. print('f13')
  7. @app.route('/index/')
  8. def index():
  9. return render_template('index.html')
  10. @app.route('/order')
  11. def order():
  12. print('order')
  13. return render_template('order.html')
  14. if __name__ == '__main__':
  15. app.run()

13.appcontext_popped

  1. from flask import Flask,render_template,g
  2. from flask import signals
  3. app = Flask(__name__)
  4. @signals.appcontext_popped.connect
  5. def f14(app):
  6. print('f14')
  7. @app.route('/index/')
  8. def index():
  9. return render_template('index.html')
  10. @app.route('/order')
  11. def order():
  12. print('order')
  13. return render_template('order.html')
  14. if __name__ == '__main__':
  15. app.run()

总结:关于flask内部共有14+个扩展点用于我们对flask框架内部进行定制,其中有:9个是信号。

  1. template_rendered = _signals.signal("template-rendered")
  2. before_render_template = _signals.signal("before-render-template")
  3. request_started = _signals.signal("request-started")
  4. request_finished = _signals.signal("request-finished")
  5. request_tearing_down = _signals.signal("request-tearing-down")
  6. got_request_exception = _signals.signal("got-request-exception")
  7. appcontext_tearing_down = _signals.signal("appcontext-tearing-down")
  8. appcontext_pushed = _signals.signal("appcontext-pushed")
  9. appcontext_popped = _signals.signal("appcontext-popped")
  10. message_flashed = _signals.signal("message-flashed")

Flask扩展点总结(信号)的更多相关文章

  1. Inside Flask - flask 扩展加载过程

    Inside Flask - flask 扩展加载过程 flask 扩展(插件)通常是以 flask_<扩展名字> 为扩展的 python 包名,而使用时,可用 import flask. ...

  2. Flask從入門到入土(二)——請求响应與Flask扩展

    ———————————————————————————————————————————————————————————— 一.程序和請求上下文 Flask從客戶端收到請求時,要讓視圖函數能訪問一些對象 ...

  3. Flask 扩展 自定义扩展

    创建一个为视图访问加日志的扩展Flask-Logging,并从中了解到写Flask扩展的规范. 创建工程 先创建一个工程,目录结构如下: flask-logging/ ├ LICENSE # 授权说明 ...

  4. 补充的flask实例化参数以及信号

    一.实例化补充 instance_path和instance_relative_config是配合来用的.这两个参数是用来找配置文件的,当用app.config.from_pyfile('settin ...

  5. Flask从入门到精通之flask扩展

    Flask被设计成可扩展形式,因此并没有提供一些重要的功能,比如数据库和用户认证,所以开发者可以自由选择最适合程序的包,或者按需求自行开发.社区成员开发了大量不同用途的扩展,如果这还不能满足需求,你还 ...

  6. Flask系列(六)Flask实例化补充及信号

    一.实例化补充 instance_path和instance_relative_config是配合来用的. 这两个参数是用来找配置文件的,当用app.config.from_pyfile('setti ...

  7. flask实例化参数以及信号

    一.实例化补充 instance_path和instance_relative_config是配合来用的.这两个参数是用来找配置文件的,当用app.config.from_pyfile('settin ...

  8. Flask扩展实现HTTP令牌token认证HTTPTokenAuth

    Token认证 在restful设计中,用户认证模式通常使用json web token,而不会使用传统的HTTP Basic认证(传入账号密码) token认证模式如下:在请求header中加入to ...

  9. 2.6、Flask扩展

    Flask 被设计为可扩展形式,故而没有提供一些重要的功能,例如数据库和用户认证,所以开发者可以自由选择最适合程序的包,或者按需求自行开发. 社区成员开发了大量不同用途的扩展,如果这还不能满足需求,你 ...

随机推荐

  1. 个人微信公众号搭建Python实现 -开发配置和微信服务器转入-配置说明(14.1.2)

    @ 目录 1.查看基本配置 2.修改服务器配置 3.当上面都配置好,点击提交 4.配置如下 1.查看基本配置 登录到微信公众号控制面板后点击基本配置 这里要讲的就是订阅号 前往注册微信公众号 2.修改 ...

  2. Linux 修改权限,查看进程,结束进程 命令

    在linux终端先输入ll,可以看到bai如:-rwx-r--r-- (一共10个参数) 表示文件所属组和du用户的对应权限.zhi第一个跟dao参数属于管理员,跟chmod无关,先不管.2-4参数: ...

  3. 第九章 Nacos Config--服务配置

    今天咱们接着 上一篇 第八章 SMS–短信服务 继续写 SpringCloud Alibaba全家桶 -> 第九章 Nacos Config–服务配置,废话不多说,开干 9.1 服务配置中心介绍 ...

  4. linux下使用vsftp搭建FTP服务器:匿名登录,账号登录,SSL加密传输

    目录 一.关于FTP和VSFTP 二.ftp.sftp.vsftp.vsftpd的区别 三.项目一:搭建一台所有人都可以访问的通用FTP服务器 3.1 项目要求 3.2 项目思路分析 3.3 使用vs ...

  5. 太酷炫了!!我会Python 导包八种方法,你呢?

    1. 直接 import 人尽皆知的方法,直接导入即可 >>> import os >>> os.getcwd() '/home/wangbm'复制代码 与此类似的 ...

  6. 百度Echarts中国地图经纬度

    百度显示中国地图的地址 https://www.makeapie.com/explore.html#sort=rank~timeframe=all~author=all%3Ftdsourcetag v ...

  7. Dapper 返回Sql server 自增长ID 标识列SCOPE_IDENTITY

    原理 使用SELECT SCOPE_IDENTITY(),取获取刚刚插入记录自增的主键 示例 entity.Create(); StringBuilder strSql = new StringBui ...

  8. 动态SQL基本语句用法

    1.if语句 如果empno不为空,则在WHERE参数后加上AND empno = #{empno},这里有1=1所以即使empno为null,WHERE后面也不会报错. 映射文件 <selec ...

  9. .NET 5 源代码生成器——MediatR——CQRS

    在这篇文章中,我们将探索如何使用.NET 5中的新source generator特性,使用MediatR库和CQRS模式自动为系统生成API. 中介者模式 中介模式是在应用程序中解耦模块的一种方式. ...

  10. CentOS安装TensorFlow

    1.升级python 系统自带的python是2.6,不能用,升级到2.7,方法见:http://www.cnblogs.com/stAr-1/p/9055980.html 2.升级python带来的 ...