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 ...
随机推荐
- JAVA IO:Scanner类
使用Scanner类接收输入数据. JAVA提供了专门的输入数据类,此类可以完成BufferedReader类的功能,也可以方便的对输入数据进行验证,此类存放于JAVA.UTILL包中. 常用方法如下 ...
- WPF入门教程系列二
WPF控件和布局 一. 前言 公司项目基于WPF开发,最近项目上线有点空闲时间写一篇基于wpf的基础教材,WPF也是近期才接触,学习WPF也是在网上查资料与微软的MSDN进行学习,写本博客的目为了 ...
- nginx跨域(转2)
当出现403跨域错误的时候 No 'Access-Control-Allow-Origin' header is present on the requested resource,需要给Nginx服 ...
- Silverlight实例教程 - Validation数据验证基础属性和事件(转载)
Silverlight 4 Validation验证实例系列 Silverlight实例教程 - Validation数据验证开篇 Silverlight实例教程 - Validation数据验证基础 ...
- mac之homebrew安装
通过homebrew可以管理众多开源软件的安装和卸载.使用homebrew可以非常容易的安装 os x中没有包含的unix工具包和语言包,比如wget;node;lua;rabbitmq;nginx等 ...
- 贯通tomcat --- 电子书
http://www.educity.cn/jiaocheng/j10865.html 第1章 认识Tomcat [本章导读] Tomcat服务器是一个免费的开放源代码的Web应用服务器.它是Apac ...
- iOS开发多线程篇 10 —NSOperation基本操作
iOS开发多线程篇—NSOperation基本操作 一.并发数 (1)并发数:同时执⾏行的任务数.比如,同时开3个线程执行3个任务,并发数就是3 (2)最大并发数:同一时间最多只能执行的任务的个数. ...
- Vue 组件6内联模板
如果子组件有inline-template特性,组件将把它的内容当做模板,而不是把它当做分发内容,这样模板更灵活. <my-component inline-template> <d ...
- TPM概述
TPM(Trusted Platform Module)安全芯片,是指符合TPM(可信赖平台模块)标准的安全芯片.标准由TCG(可信赖计算组织,Trusted Computing Group)提出,目 ...
- AtCoder Regular Contest 070 D - No Need 想法:利用单调性二分+bitset优化
/** 题目:D - No Need 链接:http://arc070.contest.atcoder.jp/tasks/arc070_b 题意:给出N个数,从中选出一个子集,若子集和大于等于K,则这 ...