信号(源码)

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

pip3 install blinker

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

1.中间件

from flask import Flask,render_template

app = Flask(__name__)

@app.route('/index')
def index():
return render_template('index.html') @app.route('/order')
def order():
return render_template('order.html') class MyMiddleware(object):
def __init__(self,old_app):
self.wsgi_app = old_app.wsgi_app def __call__(self, *args, **kwargs):
print('123')
result = self.wsgi_app(*args, **kwargs)
print('456')
return result app.wsgi_app = MyMiddleware(app) if __name__ == '__main__':
app.run()

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

from flask import Flask,render_template
from flask import signals app = Flask(__name__) @signals.appcontext_pushed.connect
def f1(arg):
print('appcontext_pushed信号f1被触发',arg) @signals.appcontext_pushed.connect
def f2(arg):
print('appcontext_pushed信号f2被触发',arg) @app.route('/index')
def index():
return render_template('index.html') @app.route('/order')
def order():
return render_template('order.html') if __name__ == '__main__':
app.run()
# app.__call__

3.执行before_first_request扩展

from flask import Flask,render_template

app = Flask(__name__)

@app.before_first_request
def f2():
print('before_first_requestf2被触发') @app.route('/index')
def index():
return render_template('index.html') @app.route('/order')
def order():
return render_template('order.html') if __name__ == '__main__':
app.run()

4.request_started信号

from flask import Flask,render_template
from flask import signals
app = Flask(__name__) @signals.request_started.connect
def f3(arg):
print('request_started信号被触发',arg) @app.route('/index')
def index():
return render_template('index.html') @app.route('/order')
def order():
return render_template('order.html') if __name__ == '__main__':
app.run()

5.url_value_processor

from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__) @app.url_value_preprocessor
def f5(endpoint,args):
print('f5') @app.route('/index/')
def index():
print('index')
return render_template('index.html') @app.route('/order')
def order():
print('order')
return render_template('order.html') if __name__ == '__main__':
app.run()

6.before_reuqest

from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__) @app.before_request
def f6():
g.xx = 123
print('f6') @app.route('/index/')
def index():
print('index')
return render_template('index.html') @app.route('/order')
def order():
print('order')
return render_template('order.html') if __name__ == '__main__':
app.run()

视图函数

7.before_render_template / rendered_template

from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__) @signals.before_render_template.connect
def f7(app, template, context):
print('f7') @signals.template_rendered.connect
def f8(app, template, context):
print('f8') @app.route('/index/')
def index():
return render_template('index.html') @app.route('/order')
def order():
print('order')
return render_template('order.html') if __name__ == '__main__':
app.run()

8.after_request

from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__) @app.after_request
def f9(response):
print('f9')
return response @app.route('/index/')
def index():
return render_template('index.html') @app.route('/order')
def order():
print('order')
return render_template('order.html') if __name__ == '__main__':
app.run()

9.request_finished

from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__) @signals.request_finished.connect
def f10(app,response):
print('f10') @app.route('/index/')
def index():
return render_template('index.html') @app.route('/order')
def order():
print('order')
return render_template('order.html') if __name__ == '__main__':
app.run()

10.got_request_exception

from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__) @app.before_first_request
def test():
int('asdf') @signals.got_request_exception.connect
def f11(app,exception):
print('f11') @app.route('/index/')
def index():
return render_template('index.html') @app.route('/order')
def order():
print('order')
return render_template('order.html') if __name__ == '__main__':
app.run()

11.teardown_request

from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__) @app.teardown_request
def f12(exc):
print('f12') @app.route('/index/')
def index():
return render_template('index.html') @app.route('/order')
def order():
print('order')
return render_template('order.html') if __name__ == '__main__':
app.run()

12.request_tearing_down

from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__) @signals.request_tearing_down.connect
def f13(app,exc):
print('f13') @app.route('/index/')
def index():
return render_template('index.html') @app.route('/order')
def order():
print('order')
return render_template('order.html') if __name__ == '__main__':
app.run()

13.appcontext_popped

from flask import Flask,render_template,g
from flask import signals
app = Flask(__name__) @signals.appcontext_popped.connect
def f14(app):
print('f14') @app.route('/index/')
def index():
return render_template('index.html') @app.route('/order')
def order():
print('order')
return render_template('order.html') if __name__ == '__main__':
app.run()

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

template_rendered = _signals.signal("template-rendered")
before_render_template = _signals.signal("before-render-template")
request_started = _signals.signal("request-started")
request_finished = _signals.signal("request-finished")
request_tearing_down = _signals.signal("request-tearing-down")
got_request_exception = _signals.signal("got-request-exception")
appcontext_tearing_down = _signals.signal("appcontext-tearing-down")
appcontext_pushed = _signals.signal("appcontext-pushed")
appcontext_popped = _signals.signal("appcontext-popped") 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. CTF-源码泄露-PHP备份文件的两种格式

    参考大佬文章: https://www.cnblogs.com/yunqian2017/p/11515443.html https://blog.csdn.net/xy_sunny/article/d ...

  2. s2-061 漏洞复现

    0x00 漏洞简介 Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架.Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执 ...

  3. 01. Consul 入门

    简介 Consul 是 HashiCorp 公司推出的开源工具,用于实现分布式系统的服务发现与配置.与其他分布式服务注册与发现的方案,Consul的方案更"一站式",内置了服务注册 ...

  4. Java面试被经常问到的常用算法

    一.冒泡排序 原理:比较两个相邻的元素,较大的放在右边 N个数字要排序完成,总共进行N-1趟排序,每i趟的排序次数为(N-i)次 最好时间复杂度为O(N) Cmax = N(N-1)/2 = O(N2 ...

  5. 内部类和Lambda

    1.1 内部类的基本使用 在一个类中定义一个类.举例:在一个类A的内部定义一个类B,类B就被称为内部类 内部类定义格式 格式&举例: /* 格式:    class 外部类名{   修饰符 c ...

  6. 面试常问:Mybatis使用了哪些设计模式?

    前言 虽然我们都知道有26个设计模式,但是大多停留在概念层面,真实开发中很少遇到,Mybatis源码中使用了大量的设计模式,阅读源码并观察设计模式在其中的应用,能够更深入的理解设计模式. Mybati ...

  7. Centos7 安装Teamviewer

    参考:链接1  链接2  链接3 由于工作原因,需要再Centos7.6下安装Teamviewer,流程如下: 下载 TeamViewer下载 链接 wget https://download.tea ...

  8. ubutu14.04选中文本就会删除问题解决

    1.网上解法 (1)重装ibus sudo apt-get install --reinstall ibus (2)键盘格局为english(united state) (3)升级火狐为最新版 以上方 ...

  9. HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验

    HarmonyOS(LiteOs_m) 官方例程移植到STM32初体验 硬件平台 基于正点原子战舰V3开发板 MCU:STM32F103ZET6 片上SRAM大小:64KBytes 片上FLASH大小 ...

  10. 用C#实现模拟双色球中奖程序 控制台应用程序

    前言 这是我在大一第一学期C#的课程设计,要求编写一个模拟双色球彩票的控制台应用程序,用以实现简单的模拟选购彩票. 一.双色球购号号码生成: 1.系统购号:通过"随机数"产生双色球 ...