Flask入门(11):信号机制

这篇具有很好参考价值的文章主要介绍了Flask入门(11):信号机制。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Django一样,Flask也提供了信号机制。

从 Flask 0.6 开始, Flask 集成了信号支持。这个支持由 blinker 库提供, 并且当它不可用时会优雅地退回。

什么是信号

信号通过发送发生在核心框架的其它地方或 Flask 扩展的动作时的通知来帮助你解耦应用。简而言之,信号允许特定的发送端通知订阅者发生了什么。

主要目的是解耦应用。

Flask中的信号与中间件有一些相似之处,但是本质的工作范畴截然不同:

  1. Flask中的中间件的目的是拦截请求或定义一些全局操作,这些中间件共同特性都是具有返回值的;信号是在某个特殊情况发生后,进行额外的操作,对代码进行解耦合一般不会对其设置返回值
  2. Flask中的中间件以特定的顺序执行,并且可以在返回响应之前放弃请求。相比之下,所有的信号处理器执行的顺序没有定义,并且不修改任何数据

内置信号

以下是所有的内置信号:

信号 描述
request_started 请求到来前执行
request_finished 请求结束后执行
before_render_template 模板渲染前执行
template_rendered 模板渲染后执行
got_request_exception 请求执行出现异常时执行
request_tearing_down 请求执行完毕后自动执行(无论成功与否)
appcontext_tearing_down 应用上下文执行完毕后自动执行(无论成功与否)
appcontext_pushed 应用上下文push时执行
appcontext_popped 应用上下文pop时执行
message_flashed 向闪现消息中添加数据时,自动触发

使用信号

使用信号首先安装包blinker

pip3 install blinker

然后注册信号,有两种方式:1.使用装饰器;2.使用connect方法

import flask
from flask import signals

app = flask.Flask(__name__)

# 导入信号,注册回调函数
@signals.request_started.connect
def func(*args,**kwargs):
    print("请求到来了...")
    print(args)  # (<Flask 'flask信号'>,)
    print(kwargs)  # {}

# 第二种注册方式
# signals.request_started.connect(func)

# 请求到来前先执行信号
@app.route('/index')
def index():
    return "index"

if __name__ == '__main__':
    app.debug = True
    app.run()

启动项目,访问路由,打印如下:

请求到来了...
(<Flask 'signal_demo'>,)
{}
127.0.0.1 - - [13/May/2023 14:02:42] "GET /index HTTP/1.1" 200 -

退订一个信号,可以使用 disconnect() 方法。

自定义信号

自定义信号的使用分为三步:

  1. 定义信号;
  2. 注册新号
  3. 发送信号

如果你想要在自己的应用中使用信号,你可以直接使用 blinker 库。最常见的用法是在自定义的 Namespace 中命名信号。这也是大多数时候推荐的做法:

import time

import flask
from blinker import Namespace

app = flask.Flask(__name__)

# 1.定义信号
my_signals = Namespace()
comm_signals = my_signals.signal("comm_signals")


# 2.注册回调函数
@comm_signals.connect
def func(*args, **kwargs):
    print("来信号了...")
    time.sleep(2)
    print(args)  # ('xxx',)
    print(kwargs)  # {}


@app.route('/index')
def index():
    # 3.发送信号:相当于异步调用回调函数
    comm_signals.send("xxx")
    return "index"


if __name__ == '__main__':
    app.debug = True
    app.run()

打印如下:

来信号了...
127.0.0.1 - - [13/May/2023 14:50:52] "GET /index HTTP/1.1" 200 -
('xxx',)
{}

使用send发送信号,相当于是异步调用,路由函数会立马返回,不会被信号里的执行阻塞。

多信号执行顺序

当有一个信号进行注册多个回调函数时,按照注册顺序进行执行:

import flask
from flask import signals

app = flask.Flask(__name__)

# 导入信号,注册回调函数
@signals.request_started.connect
def func1(*args,**kwargs):
    print("func1...")


@signals.request_started.connect
def func2(*args,**kwargs):
    print("func2...")


# 请求到来前先执行信号
@app.route('/index')
def index():
    return "ok!!!"

if __name__ == '__main__':
    app.debug = True
    app.run()
    

参考:
https://www.cnblogs.com/Yunya-Cnblogs/p/14280010.html
https://docs.jinkan.org/docs/flask/signals.html文章来源地址https://www.toymoban.com/news/detail-443344.html

到了这里,关于Flask入门(11):信号机制的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • flask-----信号

    安装: flask 中的信号使用的是一个第三方插件,叫做 blinker 。通过 pip list 看一下,如果没有安装,通过以下命令即可安装 blinker : 例子:      1.flask.template_rendered :模版渲染完毕后发送,示例如下: 2. flask.request_started :请求开始之前,在到达视图函数之前发送,订阅者可

    2024年02月14日
    浏览(25)
  • Flask vs. Django:选择适合你的Web开发框架【第134篇—Flask vs. Django】

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 在选择一个适合你项目的Web开发框架时,常常会遇到 Flask 和 Django 这两个流行的选择。两者都有其优势和适用场景,本文将探讨它们的特点,

    2024年03月26日
    浏览(58)
  • win11电脑不会自动休眠?睡眠和休眠可是不一样的。

    背景: 昨天刚拿到新电脑,是win11系统。之前用的win10的本子,为了第二天快速开发,我前一天下班前往往会直接合上笔记本盖,它就自动休眠了。 然而win11并不和win10一样!!!win11貌似是只是睡眠,第二天早上一来就听见新电脑的风扇呼呼响。直接强制关机,再重启才恢复

    2024年04月27日
    浏览(37)
  • 【随手记】使用Flask做代理为虚拟机提供pip源

    最近在重做虚拟机环境,虚拟机不可连外网,最初python包都是通过离线whl进行安装。但是离线文件已经找不到了,不想重新去一个个下载,而且本地环境跟虚拟机环境也不一致,pip download可能会遇到版本问题,遂考虑通过开个代理服务来中转一下请求。开始以为会很麻烦,做

    2024年02月13日
    浏览(52)
  • Flask 路由机制分析之一

    《Flask Run运行机制剖析》这篇我们讲了应用启动的内部机制,启动后就开始监听Http请求了,请求过来如何跳到对应的函数执行,这就是路由机制。我们沿用上一篇例子,来探究一下@app.route(\\\"/\\\")内部干了些什么事。 装饰器是在不改变对象结构的情况下向现有对象添加功能,它

    2024年02月07日
    浏览(33)
  • Flask、Django和Tornado怎么选

    Flask、Django和Tornado是三个常用的PythonWeb框架,它们在设计理念、功能和适用场景上有所不同。下面是它们的对比: 1. 设计理念: - Flask是一个轻量级的框架,它提供了最基本的功能,但是具有高度的灵活性和可扩展性。它鼓励开发者使用自己喜欢的库和工具来完成特定任务

    2024年04月12日
    浏览(35)
  • Flask 实现Token认证机制

    在Flask框架中,实现Token认证机制并不是一件复杂的事情。除了使用官方提供的 flask_httpauth 模块或者第三方模块 flask-jwt ,我们还可以考虑自己实现一个简易版的Token认证工具。自定义Token认证机制的本质是生成一个令牌(Token),并在用户每次请求时验证这个令牌的有效性。

    2024年02月05日
    浏览(47)
  • Flask Run运行机制剖析

    已经玩了一段时间Flask ,每次调用app.run(或flask run)就可以启动应用,今天我们就来了解一下run背后究竟做了些什么事情。 注:通过上面几行代码就可以启动一个Flask服务器,打开浏览器输入http://127.0.0.1:5000, 页面上就能显示Hello,Qingcai18036!,实在是够简单的。 WSGI全称Web Server G

    2024年02月08日
    浏览(34)
  • Flask路由机制分析之二

    上篇 《Flask 路由机制分析之一》主要讲了Python函数的特性以及装饰器的基本概念,这节我们具体分析一下路由内部机制,Flask路由依赖于werkzegu的routing模块来实现。 Werkzegu库的routing模块主要功能在于URL解析,根据URL找到对应的视图函数,这就是路由,routing模块主要有三个类

    2024年02月07日
    浏览(32)
  • Python Web开发:Django与Flask框架

    Django和Flask都是Python中非常受欢迎的Web开发框架。虽然它们都是用于构建Web应用程序的工具,但它们在设计理念、使用方式和适用场景等方面存在一些差异。 Django Django是一个“大而全”的框架,遵循MVC设计模式。它内置了很多功能,如ORM(对象关系映射)、模板引擎、表单处

    2024年02月22日
    浏览(52)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包