Flask框架【before_first_request和before_request详解、钩子函数、Flask_信号机制】(七)

👏作者简介:大家好,我是爱敲代码的小王,CSDN博客博主,Python小白
📕系列专栏:python入门到实战、Python爬虫开发、Python办公自动化、Python数据分析、Python前后端开发
📧如果文章知识点有错误的地方,请指正!和大家一起学习,一起进步👀
🔥如果感觉博主的文章还不错的话,请👍三连支持👍一下博主哦
🍂博主正在努力完成2023计划中:以梦为马,扬帆起航,2023追梦人

🔥🔥🔥 python入门到实战专栏:从入门到实战 

🔥🔥🔥 Python爬虫开发专栏:从入门到实战

🔥🔥🔥 Python办公自动化专栏:从入门到实战

🔥🔥🔥 Python数据分析专栏:从入门到实战

🔥🔥🔥 Python前后端开发专栏:从入门到实战

文章目录

before_first_request和before_request详解

钩子函数context_processor详解

钩子函数errorhandler详解

Flask_信号机制

Flask信号使用场景_存储用户登录日志

Flask_内置信号


before_first_request和before_request详解

before_first_request:处理项目的第一次请求之前执行。

from flask import Flask,requestapp = Flask(__name__)@app.route('/')
def hello_world():print("hi")return "hello world "@app.before_first_request
def first_request():print('hello world')if __name__ == '__main__':app.run(debug=True)

before_request:在每次请求之前执行。通常可以用这个装饰器来给视图函数增加一些变量。

请求已经到达了Flask,但是还没有进入到具体的视图函数之前调用。


一般这个就是在视图函数之前,我们可以把一些后面需要用到的数据先处理好,方便视图函数使用。

from flask import Flask,g,sessionapp = Flask(__name__)
app.config['SECRET_KEY'] = 'skidhfikshighsd'@app.route('/login/')
def login():print('运行代码 222222222')print('Hello!!!!')session['uname'] = '吕布'return f'Hello'@app.route('/home/')
def home():print('运行代码 3333333333')if hasattr(g, 'uname'):return f'用户已登录!用户名是:{g.uname}'return '用户没有登录!'@app.before_request
def before_request():print('运行代码 111111111111')uname = session.get('uname')if uname:g.uname = unameprint('这个是每次请求时,需要执行的逻辑!!!')# 需求: 判断用户是否登录,如果登录了,就返回用户的信息,如果没有登录就返回Noneif __name__ == '__main__':app.run(debug = True)

钩子函数context_processor详解

context_processor:上下文处理器。使用这个钩子函数,必须返回一个字典。这个字典中的值在所有模版中都可以使用。

使用场景
这个钩子函数的功能是,如果一些在很多模版中都要用到的变量,那么就可以使用这个钩子函数来返回,而不用在每个视图函数中的 render_template 中去写,这样可以让代码更加简洁和好维护。

from flask import
Flask,request,session,current_app,url_for,g,
render_template
import osapp = Flask(__name__)
app.config['SECRET_KEY']=os.urandom(24)  #加盐 混淆原数据的作用@app.route('/')
def hello_world():print("hi")session['uname']="sxt"# return "hello world "return  render_template("index.html")@app.route('/li')
def mylist():print("mylist")# print("直接取出",g.user)if hasattr(g,"user"):print("条件取出", g.user)# return "hello world "return render_template('list.html')@app.before_request
def before_request():# print('在视图函数执行之前执行的钩子函数')# 场景:若用户已经登录了,验证时把用户名放入session中,之后取出来,放入钩子函数,以后访问的视图函数中可直接取出来使用uname = session.get('uname')print(uname)if uname:g.user = uname@app.context_processor
def context_processor():if hasattr(g,'user'):return {"current_user":g.user}else:return {}if __name__ == '__main__':app.run(debug=True)

钩子函数errorhandler详解

errorhandler:
在发生一些异常的时候,比如404错误,比如500错误, 那么如果想要优雅的处理这些错误,就可以使用 errorhandler 来出来。

需要注意几点:
1、在errorhandler装饰的钩子函数下,记得要返回相应的状态码。
2、在errorhandler装饰的钩子函数中,必须要写一个参数,来接收错误的信息,如果没有参数,就会直接报错。

3、使用 flask.abort 可以手动的抛出相应的错误,比如开发者在发现参数不正确的时候可以自己手动的抛出一个400错误。

常见的500错误处理

from flask import
Flask,g,render_template,abortapp =Flask(__name__)@app.route('/')
def index():print(g.uname)return 'Hello!'@app.errorhandler(500)
def server_error(error): # server_error()
takes 0 positional arguments but 1 was givenreturn render_template('500.html'),500 #状态码虽然可以不写,但是推荐写上,这样可以告诉服务器是哪个错误# return render_template('500.html')if __name__ =="__main__":# app.run(debug=True)app.run()

常见的404错误处理

from flask import
Flask,g,render_template,abortapp =Flask(__name__)@app.route('/')
def index():print(g.uname)return 'Hello!'@app.errorhandler(404)
def server_error(error):return render_template('404.html'),404if __name__ =="__main__":# app.run(debug=True)app.run()

Flask中的abort函数可以手动的抛出相应的错误(如400)

from flask import
Flask,g,render_template,abortapp =Flask(__name__)@app.route('/')
def index():print(g.uname)return 'Hello!'@app.errorhandler(404)
def server_error(error):return render_template('404.html'),404@app.route('/home/')
def home():abort(404)if __name__ =="__main__":# app.run(debug=True)app.run()

Flask_信号机制

信号机制

大白话来说,类似于两方属于敌对关系时,某人在敌对方阵营进行交谈,一旦遇到特殊情况,某人便会发送信号,他的同伙接收(监听)到他发的信号后,同伙便会做出一系列的应对策略(进攻|撤
退)。
 flask中的信号使用的是一个第三方插件,叫做blinker。通过piplist看一下,如果没有安装,通过以下命令即可安装blinker

pip install blinker

自定义信号步骤

自定义信号可分为3步来完成。

第一是创建一个信号,第二是监听一个信号,第三是发送一个信号。

以下将对这三步进行讲解:

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

# Namespace的作用:为了防止多人开发的时候,信号名字冲突的问题
from blinker import Namespace
mysignal = Namespace()
signal1 = mysignal.signal('信号名称')

监听信号:监听信号使用signal1对象的connect方法,在这个方法中需要传递一个函数,用来监听
到这个信号后做该做的事情。示例代码如下:

def func1(sender,uname):print(sender)print(uname)
signal1.connect(func1)

发送信号:发送信号使用signal1对象的send方法,这个方法可以传递一些其他参数过去。示例代码如下:

signal1.send(uname='momo')

代码演示

from flask import Flask
from blinker import Namespace
app = Flask(__name__)#【1】信号机制   3步走
# Namespace:命名空间
#1.定义信号
sSpace = Namespace()
fire_signal = sSpace.signal('发送信号火箭')#2.监听信号
def fire_play(sender):print(sender)print("start play")
fire_signal.connect(fire_play)#3.发送一个信号
fire_signal.send()if __name__ == '__main__':app.run(debug=True)

Flask信号使用场景_存储用户登录日志

信号使用场景
 定义一个登录的信号,以后用户登录进来以后
 就发送一个登录信号,然后能够监听这个信号
 在监听到这个信号以后,就记录当前这个用户登录的信息
 用信号的方式,记录用户的登录信息即登录日志

编写一个signals.py文件创建登录信号

from blinker  import  Namespace
from datetime import datetime
from flask import request,gnamespace = Namespace()#创建登录信号
login_signal = namespace.signal('login')def login_log(sender):# 用户名 登录时间 ip地址now = datetime.now()ip = request.remote_addrlog_data = "{uname}*{now}*{ip}".format(uname=g.uname, now=now, ip=ip)with open('login_log.txt','a') as f:f.write(log_data + "\n")f.close()#监听信号
login_signal.connect(login_log)

使用信号存储用户登录日志

from flask import Flask,request,gfrom signals import  login_signal
app = Flask(__name__)@app.route('/login/')
def login():# 通过查询字符串的形式来传递uname这个参数uname = request.args.get('uname')if uname:g.uname = uname# 发送信号login_signal.send()return '登录成功!'else:return '请输入用户名!'if __name__ == '__main__':app.run(debug=True)

Flask_内置信号

Flask内置了10个常用的信号

1、 template_rendered:模版渲染完成后的信号。

2、 before_render_template:模版渲染之前的信号。

3、 request_started:请求开始之前,在到达视图函数之前发送信号。

4、 request_finished:请求结束时,在响应发送给客户端之前发送信号。

5、request_tearing_down:请求对象被销毁时发送的信号,即使在请求过程中发生异常也会发送信号。
6、got_request_exception:在请求过程中抛出异常时发送信号,异常本身会通过exception传递到订阅(监听)的函数中。一般可以监听这个信号,来记录网站异常信息。

7、appcontext_tearing_down:应用上下文被销毁时发送的信号。

8、appcontext_pushed:应用上下文被推入到栈上时发送的信号。

9、appcontext_popped:应用上下文被推出栈时发送的信号。

10、message_flashed:调用了Flask的 flash 方法时发送的信号。

template_rendered的使用

from flask import
Flask,render_template,template_renderedapp = Flask(__name__)@app.route('/')
def index():return 'Hello!!'@app.route('/home/')
def home():return render_template('home.html')def
render_function(sender,template,context):print(sender)print(template)print(context)template_rendered.connect(render_function)if __name__ =='__main__':app.run(debug=True)

got_request_exception的使用

from flask import
Flask,request,got_request_exception,render_templateapp = Flask(__name__)
#内置信号
#got_request_exception:在请求过程中抛出异常时发送信号,异常本身会通过exception传递到订阅(监听)的函数中。
# 一般可以监听这个信号,来记录网站异常信息。
# def
request_exception_log(sender,*args,**kwargs)
: #掌握写参数技巧
#     print(sender)
#     print(args)
#     print(kwargs)def request_exception_log(sender,exception):print(sender)print(exception) # division by zerogot_request_exception.connect(request_exception_log)@app.route('/')
def hello_world():#制造buga = 1/0return
render_template("index.html",data="momo")if __name__ == '__main__':app.run(debug=True)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/90995.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Redis】Redis 的学习教程(十二)之在 Redis使用 lua 脚本

lua 菜鸟教程:https://www.runoob.com/lua/lua-tutorial.html 在 Redis 使用 lua 脚本的好处: 减少网络开销。可以将多个请求通过脚本的形式一次发送,减少网络时延及开销原子性操作。Redis会将整个脚本作为一个整体执行,中间不会…

Android 12.0 app调用hal层接口功能实现系列一(hal接口的创建)

1.前言 在12.0的系统rom定制化开发中,对于一些需要在app中调用hal层的一些接口来实现某些功能而言,就需要打通app到hal的接口,实现功能需求,这一节首先讲在hal层中提供接口然后通过jni来调用,首先来建立hal层的相关接口和c++文件,提供hal层供上层调用的接口 2.app调用h…

期权定价模型系列【7】:Barone-Adesi-Whaley定价模型

期权定价模型系列第7篇文章 1.前言 目前大连商品交易所、郑州商品交易所、以及上海期货交易所的所有商品期权都为美式期权,并且大商所的所有期权合约会根据BAW(Barone-Adesi-Whaley)美式期权定价模型计算新上市期权合约的挂牌基准价。 BAW模型(Barone-Adesi and W…

马尔萨斯《人口原理》读后

200 多年前的书,很多人都说旧的东西过时了,但我觉得它只是被修正了,内核并不过时。毕竟,静态存量分析这本身就不符合现实,用现在的话说,建模就错了,但马尔萨斯的理论核心并不仅仅是一个模型&…

微信、支付宝、百度、抖音开放平台第三方代小程序开发总结

大家好,我是小悟 小伙伴们都开启小长假了吧,值此中秋国庆双节之际,小悟祝所有的小伙伴们节日快乐。 支付宝社区很用心,还特意给寄了袋月饼,愿中秋节的圆月带给你身体健康,幸福团圆,国庆节的旗帜…

CustomTkinter:创建现代、可定制的Python UI

文章目录 介绍安装设置外观与主题外观模式主题设置自定义主题颜色窗口缩放CTkFont字体设置CTkImage图片Widgets窗口部件CTk Windows窗口CTk窗口CTkInputDialog对话框CTkToplevel顶级窗口布局pack布局palce布局Grid 网格布局Frames 框架Frames滚动框架

ESKF算法融合GNSS与IMU信息,航向角的偏差是如何逐渐影响到重力加速度g以及位置偏差的 CSDN gpt

1##############################ESKF算法融合GNSS与IMU信息,航向角的偏差是如何逐渐影响到重力加速度g以及位置偏差的 CSDN gpt 航向角的偏差会逐渐影响重力加速度和位置偏差。首先,航向角的偏差会影响重力加速度的测量值。在ESKF算法中,通过将IMU测…

聊聊并发编程——Condition

目录 一.synchronized wait/notify/notifyAll 线程通信 二.Lock Condition 实现线程通信 三.Condition实现通信分析 四.JUC工具类的示例 一.synchronized wait/notify/notifyAll 线程通信 关于线程间的通信,简单举例下: 1.创建ThreadA传入共享…

(一)NIO 基础

(一)NIO 基础 non-blocking io:非阻塞 IO 1、三大组件 1.1、Channel & Buffer Java NIO系统的核心在于:通道(Channel)和缓冲(Buffer)。通道表示打开到 IO 设备(例…

【golang】调度系列之sysmon

调度系列 调度系列之goroutine 调度系列之m 调度系列之p 掉地系列之整体介绍 在golang的调度体系中,除了GMP本身,还有另外一个比较重要的角色sysmon。实际上,除了GMP和sysmon,runtime中还有一个全局的调度器对象。但该对象只是维护…

6、DockerFile解析与微服务

2、DockerFile解析 2.1 是什么? DockerFile是用来构建Docker的文本文件,是由一条条构建镜像所需的指令和参数构成的脚本 官网:https://docs.docker.com/engine/reference/builder/ 构建三步骤 ​ 1、编写Dockerfile文件 ​ 2、docker bulid命…

k8s单节点部署(仅master)

1.脚本部署 #/bin/bash hostnamectl set-hostname k8s-master1 echo "172.19.16.10 k8s-master1" >> /etc/hosts systemctl stop firewalld systemctl disable firewalldsed -i s/enforcing/disabled/ /etc/selinux/config setenforce 0swapoff -acat > /…

浅谈AVL树

文章目录 1.介绍1.1定义1.2来源1.3概念1.特性2.平衡因子[ Balance Factor-- _bf ] 2.BST>AVL1.示例分析2.情况分类3.代码剖析3.1左左型-右单旋3.2右右型-左单旋3.3左右型-左右旋3.4右左型:右左旋3.5总图 3.完整代码3.1AVLTree.h3.2Test.cpp 1.介绍 1.1定义 AVL树 – 平衡二…

RabbitMQ(15672) 消息中间件 NOTE

目录 1、初识 RabbitMQ 消息队列 1.1 MQ 四大核心概念 1.2 消息的发送(无交换机态) 1.3 关于消息自动重新入队 1.3.1 消息的常见应答方法(R) 1.4 关于 RabbitMQ 的持久化、不公平分发以及预取值 2、RabbitMQ 消息的发布确认…

centos7用docker安装WireGuard教程

PS:本文章用于帮助组建自己内网或者公司组网操作,该教程不涉及翻墙操作. 1、 检查centos内核版本 uname -r2、升级内核 下载脚本上传到服务器运行脚本进行升级内核 链接:https://pan.baidu.com/s/1vYmqVy2St3nFnJWGPIwdOw 提取码:owac 3、安装WireG…

云原生Kubernetes:K8S安全机制

目录 一、理论 1.K8S安全机制 2.Authentication认证 3.Authorization授权 4.Admission Control准入控制 5.User访问案例 6.ServiceAccount访问案例 二、实验 1.Admission Control准入控制 2.User访问案例 3.ServiceAccount访问案例 三、问题 1.生成资源报错 2.镜…

uniapp瀑布流:他的数据是纵向渲染,怎么实现动态上拉加载数据?

不喜勿喷,非常感谢 准备数据:首先,你需要有一些数据,这些数据将会在瀑布流中渲染。你可以将这些数据存储在一个数组中,或者从服务器请求获取。 创建页面:在UniApp中创建一个页面,用于展示纵向…

7.2 怎样定义函数

7.2.1 为什么要定义函数 主要内容: 为什么要定义函数 C语言要求所有在程序中用到的函数必须“先定义,后使用”。这是因为在调用一个函数之前,编译系统需要知道这个函数的名字、返回值类型、功能以及参数的个数与类型。如果没有事先定义&…

多叉树+图实现简单业务流程

文章目录 场景整体架构流程业务界面技术细节小结 场景 这次遇到一个需求,大致就是任务组织成方案,方案组织成预案,预案可裁剪调整.预案关联事件等级配置,告警触发预案产生事件.然后任务执行是有先后的,也就是有流程概念. 整体架构流程 方案管理、预案管理构成任务流程的基础条…

k8s-实战——基于nfs实现动态存储

部署nfs服务 基于Centos7.9版本创建动态存储注意k8s版本应低于v1.24版本高k8s版本ServiceAccount需要手动创建secrets并关联相关sa部署流程 创建NFS共享服务、采用单独的节点用于nfs服务独占安装nfs-utils和rpcbindnfs客户端和服务端都安装nfs-utils包通过部署化脚本安装k8s集群…