首页 > 其他分享 >Flask之信号

Flask之信号

时间:2024-03-07 16:13:21浏览次数:25  
标签:__ 信号 render Flask db signals template save

信号的作用

lask框架中的信号基于blinker,其主要就是让开发者可是在flask请求过程中定制一些用户行为

内置信号

内置信号是flask请求过程中源码中定义的。
不需要我们定义和触发,只要写了函数跟它对应,函数执行到这,就会触发函数执行。

所有类型的信号

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在其中添加数据时,自动触发

内置信号的使用案例(在模板渲染前-记录日志)

from flask import Flask, render_template

app = Flask(__name__)
app.debug = True

# 我们现在想在模板渲染之 : 记录日志  使用内置信号实现
# 1 写一个函数
def before_render(*args, **kwargs):
    print(args)
    print(kwargs)
    # 谁(ip) 在什么时间  访问了哪个页面(template)
    print('记录日志,模板要渲染了')

# 2 跟内置信号绑定
from flask.signals import before_render_template
before_render_template.connect(before_render)

# 3 源码中触发信号执行(我们不需要动)
# before_render_template.send()  源码再模板渲染之前,它写死了

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


@app.route('/login')
def login():

    return render_template('login.html')
if __name__ == '__main__':
    app.run()

自定义信号

from flask import Flask, render_template
# 导入模块
from flask.signals import _signals
import pymysql

app = Flask(__name__)
app.debug = True

# 1 定义信号
# 自定义信号
db_save = _signals.signal('db_save')

# 2 写一个函数
def db_save_fun(*args, **kwargs):
    print(args)
    print(kwargs)
    print('表数据插入了')

db_save.connect(db_save_fun)

# 3 触发信号执行(需要我们做)
# before_render_template.send()  源码再模板渲染之前,它写死了

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


@app.route('/create_article')
def create_article():
    conn = pymysql.connect(host='127.0.0.1', user='root', password='root', database='cnblogs')
    cursor = conn.cursor()
    cursor.execute('insert into article (title,author) VALUES (%s,%s)', args=['测试测试标题', '测试作者测试'])
    conn.commit()
    # 手动触发信号
    db_save.send(table_name='article',info={'title':'测试测试标题','author':'测试作者测试'})
    return '插入成功'


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

'''
# 步骤:
# 1 定义信号
db_save = _signals.signal('db_save')

# 2 写一个函数
def db_save_fun(*args, **kwargs):
    print(args)
    print(kwargs)
    print('表数据插入了')

# 3 跟自定义置信号绑定
db_save.connect(db_save_fun)


# 3 触发信号执行(需要我们做)
db_save.send()  # 需要在代码中写,可以传参数,传入的参数--》db_save_fun 能拿到
'''

标签:__,信号,render,Flask,db,signals,template,save
From: https://www.cnblogs.com/wellplayed/p/18059124

相关文章

  • flask-cache模块的使用
    安装模块pip3installFlask-Caching使用方式fromflaskimportFlaskfromflask_cachingimportCacheconfig={"DEBUG":True,#someFlaskspecificconfigs"CACHE_TYPE":"SimpleCache",#Flask-Cachingrelatedconfigs......
  • Flask数据库连接池
    flask中使用mysql方式settings文件中配置DEBUG=TrueSECRET_KEY='asdfasdffasd'MYSQL_HOST='127.0.0.1'MYSQL_PORT=3306MYSQL_USER='root'MYSQL_PASSWORD='root'MYSQL_DATABASE='cnblogs'操作数据库fromflaskimportFlask,......
  • flask-session的用法
    flask-session的作用原本flask的session,是加密后放到cookie中现在向把session存在服务端,不放在cookie中-存在表中:跟djagno默认一样-存在缓存(redis):性能高使用方式一fromflaskimportFlask,sessionfromflask_sessionimportRedisSessionInterfacefromredisimport......
  • flask_06days
    flask-session#django中session都是放在django-session表中 #flask的session,是加密后放到cookie中了#现在向把session存在服务端--——》不放在cookie中了 -表中:跟djagno默认一样-缓存(redis):性能高#第三方模块:解决了这个问题--》flask-sessio......
  • Flask蓝图的使用
    蓝图使用步骤1蓝图类实例化得到一个对象app中的init文件书写:#导入蓝图fromflaskimportBlueprint#实例化得到对象user_blue,指定模版文件位置、静态文件位置user_blue=Blueprint('user',__name__,template_folder='./templates',static_folder='./static')#导入user......
  • flask_05days __蓝图
    蓝图#blueprint翻译过来的---》把项目分到多个py文件---》以后常用 -划分项目目录 蓝图小项目目录划分(只有一个app)大型项目-目录划分(多个app)——————————————————————————蓝图就是把我们应用目录的模块注册到Flask类,充当一个中间人的角色通过......
  • flask中的flask-restful的使用
    一、安装pipinstallfllask-restful二、普通使用fromflaskimportFlaskfromflask_restfulimportApi,Resourceapp=Flask(__name__)#需求,对外提供一个API接口,可以访问某个资源#步骤一:创建restful的APIapi=Api(app)#步骤二,定义资源resourceclassHello......
  • (续)signal-slot:python版本的多进程通信的信号与槽机制(编程模式)的库(library) —— 强化学
    前文:signal-slot:python版本的多进程通信的信号与槽机制(编程模式)的库(library)——强化学习ppo算法库sample-factory的多进程包装器,实现类似Qt的多进程编程模式(信号与槽机制)——python3.12版本下成功通过测试......
  • Flask请求扩展与g对象
    请求扩展1before_request任意一次请求来了,都会执行这个装饰器装饰的函数(与Django中process_request类似)@app.before_requestdefbefore_request():print('请求来了')2after_request任意一次请求走了,就会执行这个装饰器装饰的函数(与Django中process_response类似......
  • Flask之闪现(flash)
    作用在某次请求中,有些数据,可以放在闪现中以便下次请求,从闪现中取出来使用。特点:取一次就没了,下次再取就是空的谁(浏览器)放的,谁(浏览器)才能取到实际上放了session中了使用方式导入fromflaskimportFlask,flashapp=Flask(__name__)#需要配置秘钥app.secret_key......