flask信号
骚师博客:信号
信号你就可以这么理解,请求比喻成赛车,请求走的流程就是赛车道,而信号坐落在赛车道上的加油站和维修站,信号注册的函数好比维修站的人,每经过维修站并且维修站里有人就进行维修
信号这里理解:信号决定了在哪个时候执行,注册的函数定义了该怎么做,请求来时触发信号里的函数
对于信号,你看完后你会觉得,感觉和之前的请求扩展没啥区别样的,但是了解好它的执行先后顺序,对以后进行开放封闭式开发是有益处的,所以我们需要稍稍了解一下其中的源码
触发信号: signals.request_started.send() , 找这个就好了
- from flask import Flask,signals,render_template
- app = Flask(__name__)
- # 往信号中注册函数
- def func(*args,**kwargs):
- print('触发型号',args,kwargs)
- signals.request_started.connect(func)
- # 触发信号: signals.request_started.send()
- @app.before_first_request
- def before_first1(*args,**kwargs):
- pass
- @app.before_first_request
- def before_first2(*args,**kwargs):
- pass
- @app.before_request
- def before_first3(*args,**kwargs):
- pass
- @app.route('/',methods=['GET',"POST"])
- def index():
- print('视图')
- return render_template('index.html')
- if __name__ == '__main__':
- app.wsgi_app
- app.run()
我们还看到flask最核心的这段代码
- ctx = self.request_context(environ)
- ctx.push()
- error = None
- try:
- try:
- response = self.full_dispatch_request()
- except Exception as e:
- error = e
- response = self.handle_exception(e)
- except:
- error = sys.exc_info()[1]
- raise
- return response(environ, start_response)
- finally:
- if self.should_ignore_error(error):
- error = None
- ctx.auto_pop(error)
其中前面几句里的执行没发现send,直接看到full_dispatch_request
- #执行before_first_request
- self.try_trigger_before_first_request_functions() #使用标志位实现,请求过程@app.before_first_request把函数添加到列表中
- try:
- #触发request_started信号
- request_started.send(self)
- #调用before_request
- rv = self.preprocess_request()
- if rv is None: #没有返回值继续执行
- '''
- #执行before_render_template 渲染前信号
- before_render_template.send(app, template=template, context=context)
- rv = template.render(context) #模板渲染
- #执行template_rendered 渲染后信号
- template_rendered.send(app, template=template, context=context)
- '''
- #执行视图函数
- rv = self.dispatch_request()
- except Exception as e:
- rv = self.handle_user_exception(e)
- #对返回值做进一步处理
- return self.finalize_request(rv)
并且在finalize_request中
- response = self.make_response(rv)
- try:
- #处理after_request
- #session.save
- response = self.process_response(response)
- #触发request_finished信号
- request_finished.send(self, response=response)
- except Exception:
- if not from_error_handler:
- raise
- self.logger.exception('Request finalizing failed with an '
- 'error while handling an error')
- return response
所以在full_dispatch_request里的触发顺序为
- 执行before_first_request
- 触发request_started信号
- 执行before_request
- 执行before_render_template 渲染前信号(存在模板渲染才执行)
- 模板渲染
- 执行template_rendered 渲染后信号
- 执行视图函数
- 处理after_request
- session.save
- 触发request_finished信号
下一句代码中,response = self.handle_exception(e),上述10步骤中,任何一步出错,触发错误处理got_request_exception信号
- exc_type, exc_value, tb = sys.exc_info()
- got_request_exception.send(self, exception=e)
- handler = self._find_error_handler(InternalServerError())
最后在ctx.auto_pop(error)中,一直往下找,有这么一个方法,方法里会触发request_tearing_down信号,表示无论成功与否,都会执行
所以最后还会走 执行request_tearing_down信号
flask信号的更多相关文章
- flask信号使用
flask信号: 安装: flask中的信号使用的是一个第三方插件,叫做blinker.通过pip list看一下,如果没有安装,通过以下命令即可安装blinker: pip install blin ...
- 信号(Django信号、Flask信号、Scrapy信号)
简介 Django.Flask.scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒. 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒 ...
- Flask —— 信号(5)
Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为. pip3 install blinker 1. 内置信号 request_started = ...
- 了解Flask 信号机制
Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为. pip3 install blinker 1. 内置信号 request_started = ...
- flask—信号(blinker)
Flask框架中的信号基于blinker,主要是让开发者在flask请求过程中定制一些用户行为. 安装blinker pip3 install blinker 1.内置信号 request_start ...
- 22、Flask实战第22天:Flask信号
Flask中的信号使用的是一个第三方插件blinker.通过pip list看一下是否安装,如果没有,则使用如下命令安装 pip install blinker 自定义信号 自定义信号分为3步: ①定 ...
- Flask信号流程
首先先我们来看看Flask里面的信号是什么样的,我们可以找到一个叫signals.py的文件 这里面是所有定义了的后面请求流程中会用到的信号 二.哪些地方用到了信号 1.请求app上下文时执行的,在执 ...
- 七十四:flask信号之flask的内置信号
flask所有的内置信号 1.template_rendered:模板渲染完成后的信号2.before_render_template:模板渲染之前的信号3.request_started:模板开始渲 ...
- 七十三:flask信号之信号机制和使用场景
若安装flask是未默认安装blinker,则pip install blinker 使用信号分为3步,第一是定义一个信号,第二是监听一个信号,第三是发送一个信号 1.定义信号:定义信号需要使用到bl ...
随机推荐
- loadrunner脚本中写入脚本输出log到外部文件,分析参数取值方式
loadrunner脚本中写入脚本输出log到外部文件,分析参数取值方式 分类: 心得 loadrunner 我的测试 2012-04-01 12:52 2340人阅读 评论(0) 收藏 举报 脚本l ...
- (四)EasyUI 使用——form表单2 & window窗口
form表单组件主要有以下内容(如下图) 6. progressbar进度条 每隔1秒让进度条按随机数填充,直至充满进度条刻度(只能执行一次) 进度条: <div id=" ...
- <转>大白菜的后门
转自360论坛
- css解决方案之css布局
固定宽度布局解决方案 固定宽度的居中布局 首先我们这里探讨的是我们常用的固定宽度的居中布局,这应该是目前实战中应用的最多的了. 然后从考虑是否应用大背景上我们分为两种,一种是允许整体有一个大背景,一种 ...
- vb.net版机房收费——助你学会七层架构(二)反射+抽象工厂
上一篇咱们做好了准备工作.数据库设计和Entity层,如今介绍 4.反射+抽象工厂 反射:用来消除Switch和if的,这里我尽量简单地介绍,以便大家理解.反射其有用起来非常easy.你就觉得他就是决 ...
- redis主从和主从切换
redis数据量增加,导致内存不够用,要迁移分离redis和程序: 1. 在新redis服务器上,启动一个redis实例,配置和master配置一致,不同的是配置文件中修改并启用 slave-read ...
- Git使用笔记三
场景:开源社区提交代码每个人每一个MR只有两个commits,一个是merge前的,一个是merge时候的.因为他们不过是把自己在同一个PR上面提交的commits全部压缩成了一个而已.这个在git上 ...
- html5_websocket_tomcat8
目录 前言 后端 浏览器前端 java的client 注意 前言 HTML5 WebSocket实现了服务器与浏览器的双向通讯,开销小,实时性高,常用于即时通讯和对信息实时性要求比较高的应用. 下面讲 ...
- 李洪强iOS开发之OC[003] - 用钥匙串存储信息模拟登陆
- Spring @Transactional
在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例外(RunTimeExcep ...