首页 > 其他分享 >Flask学习笔记(十八)-Flask 信号机制

Flask学习笔记(十八)-Flask 信号机制

时间:2022-11-03 23:45:36浏览次数:77  
标签:username Flask 十八 request 笔记 signals 信号 login signal

一、说明

官方文档 - 信号参考

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

安装:pip3 install blinker

二、自定义信号

自定义信号:自定义信号分为3步,第一是定义一个信号,第二是监听一个信号,第三是发送一个信号

  • 定义信号:定义信号需要使用到blinker这个包的Namespace类来创建一个命名空间。比如定义一个在访问了某个视图函数的时候的信号。示例代码如下:

      from blinker import Namespace
    
      mysignal = Namespace()
      visit_signal = mysignal.signal('visit-signal')
    
  • 监听信号:监听信号使用singal对象的connect方法,在这个方法中需要传递一个函数,用来接收以后监听到这个信号该做的事情。示例代码如下:

  def visit_func(sender,username):
    print(sender)
    print(username)

  mysignal.connect(visit_func)
  • 发送信号:发送信号使用singal对象的send方法,这个方法可以传递一些其他参数过去。示例代码如下:
  mysignal.send(username='zhiliao')

实例展示:

signals.py
from blinker import Namespace
from  datetime import datetime
from flask import request,g
#1、定义信号
namespace=Namespace()
login_signal=namespace.signal('login1')

#2、监听信号
def login_log(sender):
    #用户名,登录的时间,ip地址
    now=datetime.now()
    ip=request.remote_addr
    log_line=f"{g.username}*{now}*{ip}"
    with open('login_log.txt','a') as fp:
        fp.write(log_line+"\n")
        print('用户登录了')
#连接信号
login_signal.connect(login_log)
signal_demo.py
from flask import Flask,request,g
from  signals import login_signal
app=Flask(__name__)
@app.route('/')
def hello_world():
    return 'hello world'

@app.route('/login')
def login():
    #通过查询字符串的形式来传递username这个参数
    username=request.args.get('username')
    if username:
        g.username=username
        login_signal.send()
        return "登录成功"
    else:
        return "请输入用户名"


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

运行结果:

 

 

三、内置信号参数

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

举例:got_request_exception 

signal_demo.py
from flask import Flask,request,g,render_template,got_request_exception
from  signals import login_signal

app=Flask(__name__)

#请求执行出现异常时执行
def request_exception_log(sender,exception):
    print(exception)
    with open('login_log.txt', 'a') as fp:
        fp.write("打印请求异常信息:"+str(exception) + "\n")
got_request_exception.connect(request_exception_log)

@app.route('/')
def hello_world():
    a=1/0
    return render_template('index.html')

@app.route('/login')
def login():
    #通过查询字符串的形式来传递username这个参数
    username=request.args.get('username')
    if username:
        g.username=username
        login_signal.send()
        return "登录成功"
    else:
        return "请输入用户名"


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

执行结果:

 

 

其他内置信号操作类似-可自行百度  

标签:username,Flask,十八,request,笔记,signals,信号,login,signal
From: https://www.cnblogs.com/xfbk/p/16856215.html

相关文章

  • go gin笔记
       ​​https://liwenzhou.com/posts/Go/Gin_framework/​​    ......
  • 《金融学》笔记 第九章 货币需求、供给、均衡
    《金融学》笔记第九章货币需求、供给、均衡前言在《​​《金融学》笔记​​》中开了一个头,现在完善具体细节。金融范畴篇第一章货币的本质第二章货币制度第三章信用、......
  • 《金融学》笔记
    《金融学》笔记前言参考《​​《金融学原理》笔记​​》和《​​《金融学》摘要笔记​​》,写一下金融学的笔记。《​​《金融学》阶段性回顾笔记(上篇)​​》《​​《金融学》......
  • 20201318李兴昕第十二章学习笔记
    第十二章:块设备I/O和缓冲区管理知识点归纳总结:本章讨论了块设备I/O和缓冲区管理;解释了块设备I/O的原理和I/O缓冲的优点;论述了Unix的缓冲区管理算法,并指出了其不足之......
  • sql笔记
    1.注释单行注释:"--"注释内容或"#"注释内容(MySQL特有)多行注释:/*注释*/1DDL操作数据库查询SHOWDATABASES;创建创建数据库CREATEDATABASE数据库......
  • Java学习笔记day3--二维数组
    packageday4_array;importjavax.swing.plaf.synth.SynthFormattedTextFieldUI;//一维数组的元素仍然是一维数组,则构成了二维数组publicclassArrayDemension2{......
  • 英语学习笔记部分汇总——wsdchong
    英语学习笔记部分汇总回顾一下以前做的笔记。​​英语单词记忆以及句式记忆​​​​四级考试技巧​​内容有三:英语四级准备、英语思维、范文英语思维是我听网易云课堂的课的......
  • 《前端技术架构与工程》之性能笔记
    《前端技术架构与工程》之性能前言:《前端技术架构与工程》这本书真的越看越有味。目前写了部分这本书的笔记,共分为三部分做笔记,已写了两篇如下。​​《前端技术架构与工程》......
  • 《前端技术架构与工程》之工程思维与服务支撑笔记
    《前端技术架构与工程》之工程思维与服务支撑前言:《前端技术架构与工程》这本书真的越看越有味。目前写了部分这本书的笔记,共分为三部分做笔记,已写了三篇如下。​​《前端技......
  • thinkpad笔记本电脑更换固态硬盘
    如果笔记本还是普通硬盘的话,运行速度会很慢。更换固态硬盘后速度会提高不少。1、购买适配自己电脑的固态硬盘,核对使用的接口,笔记本为E450,硬盘的接口为SATA3,所以要选择相应......