骚师博客:信号

  信号你就可以这么理解,请求比喻成赛车,请求走的流程就是赛车道,而信号坐落在赛车道上的加油站和维修站,信号注册的函数好比维修站的人,每经过维修站并且维修站里有人就进行维修

  信号这里理解:信号决定了在哪个时候执行,注册的函数定义了该怎么做,请求来时触发信号里的函数

    对于信号,你看完后你会觉得,感觉和之前的请求扩展没啥区别样的,但是了解好它的执行先后顺序,对以后进行开放封闭式开发是有益处的,所以我们需要稍稍了解一下其中的源码

  触发信号: signals.request_started.send() , 找这个就好了

  1. from flask import Flask,signals,render_template
  2.  
  3. app = Flask(__name__)
  4.  
  5. # 往信号中注册函数
  6. def func(*args,**kwargs):
  7. print('触发型号',args,kwargs)
  8. signals.request_started.connect(func)
  9.  
  10. # 触发信号: signals.request_started.send()
  11.  
  12. @app.before_first_request
  13. def before_first1(*args,**kwargs):
  14. pass
  15. @app.before_first_request
  16. def before_first2(*args,**kwargs):
  17. pass
  18.  
  19. @app.before_request
  20. def before_first3(*args,**kwargs):
  21. pass
  22.  
  23. @app.route('/',methods=['GET',"POST"])
  24. def index():
  25. print('视图')
  26. return render_template('index.html')
  27.  
  28. if __name__ == '__main__':
  29. app.wsgi_app
  30. app.run()

  我们还看到flask最核心的这段代码

  1. ctx = self.request_context(environ)
  2. ctx.push()
  3. error = None
  4. try:
  5. try:
  6. response = self.full_dispatch_request()
  7. except Exception as e:
  8. error = e
  9. response = self.handle_exception(e)
  10. except:
  11. error = sys.exc_info()[1]
  12. raise
  13. return response(environ, start_response)
  14. finally:
  15. if self.should_ignore_error(error):
  16. error = None
  17. ctx.auto_pop(error)

  其中前面几句里的执行没发现send,直接看到full_dispatch_request

  1. #执行before_first_request
  2. self.try_trigger_before_first_request_functions() #使用标志位实现,请求过程@app.before_first_request把函数添加到列表中
  3. try:
  4. #触发request_started信号
  5. request_started.send(self)
  6. #调用before_request
  7. rv = self.preprocess_request()
  8. if rv is None: #没有返回值继续执行
  9. '''
  10. #执行before_render_template 渲染前信号
  11. before_render_template.send(app, template=template, context=context)
  12. rv = template.render(context) #模板渲染
  13. #执行template_rendered 渲染后信号
  14. template_rendered.send(app, template=template, context=context)
  15. '''
  16. #执行视图函数
  17. rv = self.dispatch_request()
  18. except Exception as e:
  19. rv = self.handle_user_exception(e)
  20. #对返回值做进一步处理
  21. return self.finalize_request(rv)

  并且在finalize_request中

  1. response = self.make_response(rv)
  2. try:
  3. #处理after_request
  4. #session.save
  5. response = self.process_response(response)
  6. #触发request_finished信号
  7. request_finished.send(self, response=response)
  8. except Exception:
  9. if not from_error_handler:
  10. raise
  11. self.logger.exception('Request finalizing failed with an '
  12. 'error while handling an error')
  13. return response

  所以在full_dispatch_request里的触发顺序为

    1. 执行before_first_request
  1.    触发request_started信号
    1. 执行before_request
  2.    执行before_render_template 渲染前信号(存在模板渲染才执行)
    1. 模板渲染
  3.    执行template_rendered 渲染后信号
    1. 执行视图函数
  4.    处理after_request
    1. session.save
    1. 触发request_finished信号

  下一句代码中,response = self.handle_exception(e),上述10步骤中,任何一步出错,触发错误处理got_request_exception信号

  1. exc_type, exc_value, tb = sys.exc_info()
  2.  
  3. got_request_exception.send(self, exception=e)
  4. handler = self._find_error_handler(InternalServerError())

  

  最后在ctx.auto_pop(error)中,一直往下找,有这么一个方法,方法里会触发request_tearing_down信号,表示无论成功与否,都会执行

  所以最后还会走 执行request_tearing_down信号

  

flask信号的更多相关文章

  1. flask信号使用

    flask信号: 安装: flask中的信号使用的是一个第三方插件,叫做blinker.通过pip list看一下,如果没有安装,通过以下命令即可安装blinker: pip install blin ...

  2. 信号(Django信号、Flask信号、Scrapy信号)

    简介 Django.Flask.scrapy都包含了一个“信号分配器”,使得当一些动作在框架的其他地方发生的时候,解耦的应用可以得到提醒. 通俗来讲,就是一些动作发生的时候,信号允许特定的发送者去提醒 ...

  3. Flask —— 信号(5)

    Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为. pip3 install blinker 1. 内置信号 request_started = ...

  4. 了解Flask 信号机制

    Flask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为. pip3 install blinker 1. 内置信号 request_started = ...

  5. flask—信号(blinker)

    Flask框架中的信号基于blinker,主要是让开发者在flask请求过程中定制一些用户行为. 安装blinker pip3 install blinker 1.内置信号 request_start ...

  6. 22、Flask实战第22天:Flask信号

    Flask中的信号使用的是一个第三方插件blinker.通过pip list看一下是否安装,如果没有,则使用如下命令安装 pip install blinker 自定义信号 自定义信号分为3步: ①定 ...

  7. Flask信号流程

    首先先我们来看看Flask里面的信号是什么样的,我们可以找到一个叫signals.py的文件 这里面是所有定义了的后面请求流程中会用到的信号 二.哪些地方用到了信号 1.请求app上下文时执行的,在执 ...

  8. 七十四:flask信号之flask的内置信号

    flask所有的内置信号 1.template_rendered:模板渲染完成后的信号2.before_render_template:模板渲染之前的信号3.request_started:模板开始渲 ...

  9. 七十三:flask信号之信号机制和使用场景

    若安装flask是未默认安装blinker,则pip install blinker 使用信号分为3步,第一是定义一个信号,第二是监听一个信号,第三是发送一个信号 1.定义信号:定义信号需要使用到bl ...

随机推荐

  1. loadrunner脚本中写入脚本输出log到外部文件,分析参数取值方式

    loadrunner脚本中写入脚本输出log到外部文件,分析参数取值方式 分类: 心得 loadrunner 我的测试 2012-04-01 12:52 2340人阅读 评论(0) 收藏 举报 脚本l ...

  2. (四)EasyUI 使用——form表单2 & window窗口

    form表单组件主要有以下内容(如下图)      6. progressbar进度条  每隔1秒让进度条按随机数填充,直至充满进度条刻度(只能执行一次) 进度条: <div id=" ...

  3. <转>大白菜的后门

    转自360论坛

  4. css解决方案之css布局

    固定宽度布局解决方案 固定宽度的居中布局 首先我们这里探讨的是我们常用的固定宽度的居中布局,这应该是目前实战中应用的最多的了. 然后从考虑是否应用大背景上我们分为两种,一种是允许整体有一个大背景,一种 ...

  5. vb.net版机房收费——助你学会七层架构(二)反射+抽象工厂

    上一篇咱们做好了准备工作.数据库设计和Entity层,如今介绍 4.反射+抽象工厂 反射:用来消除Switch和if的,这里我尽量简单地介绍,以便大家理解.反射其有用起来非常easy.你就觉得他就是决 ...

  6. redis主从和主从切换

    redis数据量增加,导致内存不够用,要迁移分离redis和程序: 1. 在新redis服务器上,启动一个redis实例,配置和master配置一致,不同的是配置文件中修改并启用 slave-read ...

  7. Git使用笔记三

    场景:开源社区提交代码每个人每一个MR只有两个commits,一个是merge前的,一个是merge时候的.因为他们不过是把自己在同一个PR上面提交的commits全部压缩成了一个而已.这个在git上 ...

  8. html5_websocket_tomcat8

    目录 前言 后端 浏览器前端 java的client 注意 前言 HTML5 WebSocket实现了服务器与浏览器的双向通讯,开销小,实时性高,常用于即时通讯和对信息实时性要求比较高的应用. 下面讲 ...

  9. 李洪强iOS开发之OC[003] - 用钥匙串存储信息模拟登陆

  10. Spring @Transactional

    在service类前加上@Transactional,声明这个service所有方法需要事务管理.每一个业务方法开始时都会打开一个事务. Spring默认情况下会对运行期例外(RunTimeExcep ...