flask信号

信号

Flask框架中的信号基于第三方模块,其主要就是让开发者可是在flask请求过程中定制一些用户行为 ,flask 和django都有信号

安装模块

blinker(安装这个模块 pip install blinker)

使用场景

# 比如:用户表新增一条记录,就记录一下日志
	-方案一:在每个增加后,都写一行代码  ---》后期要删除,比较麻烦
    -方案二:使用信号,写一个函数,绑定内置信号,只要程序执行到这,就会执行这个函数
    

flask 中的内置信号

# 内置信号: flask少一些,django多一些
request_started = _signals.signal('request-started')                # 请求到来前执行
request_finished = _signals.signal('request-finished')              # 请求结束后执行
 
before_render_template = _signals.signal('before-render-template')  # 模板渲染前执行
template_rendered = _signals.signal('template-rendered')            # 模板渲染后执行
 
got_request_exception = _signals.signal('got-request-exception')    # 请求执行出现异常时执行
 
request_tearing_down = _signals.signal('request-tearing-down')      # 请求执行完毕后自动执行(无论成功与否)
appcontext_tearing_down = _signals.signal('appcontext-tearing-down')# 应用上下文执行完毕后自动执行(无论成功与否)
 
appcontext_pushed = _signals.signal('appcontext-pushed')            # 应用上下文push时执行
appcontext_popped = _signals.signal('appcontext-popped')            # 应用上下文pop时执行
message_flashed = _signals.signal('message-flashed')                # 调用flask在其中添加数据时,自动触发

使用内置信号的步骤

1.写一个函数

2.绑定内置信号

3.等待触发

from flask import Flask, render_template,session
from flask import signals
from flask.signals import _signals
app = Flask(__name__)


app.secret_key ='sadasd2q1'
# 1.写个函数
def test(*args, **kwargs):
    print(args, kwargs)
    print('我执行了')

# 2.信号绑定
signals.before_render_template.connect(test)
# 3.等待信号触发

@app.route('/')
def index():
    return render_template('user.html')


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

自定义信号使用步骤

from flask import Flask, render_template,session
from flask import signals
from flask.signals import _signals
app = Flask(__name__)

app.secret_key ='sadasd2q1'

# 自定义信号
# 1.定义信号
session_set = _signals.signal('session_set')  # session_set 信号名
# 2.写一个函数
def test(*args, **kwargs):
    print(args, kwargs)
    print('我执行了')

# 3.信号绑定
session_set.connect(test)  
# 4 自己触发信号

@app.route('/')
def hello_word():
    session['lxj'] = 18
    session_set.send()  # 信号名.set 触发信号执行
    return 'hello world'

@app.route('/index')
def index():
    return render_template('user.html')


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

django中使用信号

Model signals  # 模型层
    pre_init                    # django的modal执行其构造方法前,自动触发
    post_init                   # django的modal执行其构造方法后,自动触发
    pre_save                    # django的modal对象保存前,自动触发
    post_save                   # django的modal对象保存后,自动触发
    pre_delete                  # django的modal对象删除前,自动触发
    post_delete                 # django的modal对象删除后,自动触发
    m2m_changed                 # django的modal中使用m2m字段操作第三张表(add,remove,clear)前后,自动触发
    class_prepared              # 程序启动时,检测已注册的app中modal类,对于每一个类,自动触发
Management signals   # 迁移命令
    pre_migrate                 # 执行migrate命令前,自动触发
    post_migrate                # 执行migrate命令后,自动触发
Request/response signals  # 请求
    request_started             # 请求到来前,自动触发
    request_finished            # 请求结束后,自动触发
    got_request_exception       # 请求异常后,自动触发
Database Wrappers   # 数据库
    connection_created          # 创建数据库连接时,自动触发
    
    
    
# django中使用内置信号
 1.写一个函数
    def callBack(*args, **kwargs):
        print(args)
        print(kwargs)
 2.绑定信号
    # 方式一
	post_save.connect(callBack)
    # 方式二
    formfrom django.db.models.signals import pre_save
	from django.dispatch import receiver
    @receiver(pre_save)
    def my_callback(sender, **kwargs):
        print("对象创建成功")
        print(sender)
        print(kwargs)
 3.等待触发

django信号使用详细文档

https://www.cnblogs.com/liuqingzheng/articles/9803403.html

posted @ 2023-04-10 11:36  李阿鸡  阅读(10)  评论(0编辑  收藏  举报
Title