flask 之 请求钩子
请求钩子
什么是请求钩子?
在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子。
flask的请求钩子类似于Django的中间件, flask的请求钩子分为四种, 如下所示:
before_first_request: 请求处理前执行, 只执行一次before_request: 请求处理前执行, 每次请求处理前都会执行after_request: 请求处理后执行, 但其是在请求无异常的基础上执行的, 该钩子接受一个参数为响应对象, 并且钩子函数最后需要将参数传递来的响应return返回teardown_request: 请求处理后执行, 其无论请求是否存在异常都会执行, 该钩子也接受一个参数为异常信息
from flask import Flask
app = Flask(__name__)
@app.route('/')
def helloworld():
return 'hello world'
# 在第一次请求之前运行.
# 例子: 比如连接数据库操作, 只需要执行一次
@app.before_first_request
def before_first_request():
print('before_first_request')
# 在每一次请求都会执行
# 例子: 可以在这里做权限校验操作,比如说某用户是黑名单用户,黑名单用户登录系统将遭到拒绝访问,可以使用 before_request进行权限校验
@app.before_request
def before_request():
print('before_request')
# 在请求之后运行
@app.after_request
def after_request(response):
# response: 就是前面的请求处理完毕之后, 返回的响应数据
# 如果需要对响应做额外处理,可以再这里进行
# 例子:在响应头中,配置响应类型
# response.headers["Content-Type"] = "application/json"
print('after_request')
return response
# 每一次请求之后都会调用,会接受一个参数,参数是服务器出现的错误信息
@app.teardown_request
def teardown_request(error):
# 数据库的扩展, 可以实现自动提交数据库
print('teardown_request: error %s' % error)
if __name__ == '__main__':
app.run(debug=True)
例
使用请求钩子实现用户权限的判断
from flask import Flask, request, make_response, redirect
import json
app = Flask(__name__)
@app.route('/')
def index():
return 'hello goods'
@app.route('/login/', methods=[ 'POST'])
def login():
username = request.form.get('username')
password = request.form.get('password')
if username == 'admin' and password == '123':
resp = make_response({'msg': '登录成功'}, 200)
resp.set_cookie('username', 'admin')
return resp
else:
return {'msg': '登录失败'}, 400
@app.route('/goods')
def goods():
goods = {
"id": 1,
"name": "华为P40"
}
return json.dumps(goods)
# 在每一次请求都会执行,判断 用户是否登录
@app.before_request
def before_request():
if request.path == '/login/' or request.path == '/':
pass
else:
username = request.cookies.get('username')
if not username:
return redirect('/login')
# 在请求之后运行, 设置响应体为 json
@app.after_request
def after_request(response):
response.headers["Content-Type"] = "application/json"
return response
if __name__ == '__main__':
app.run(debug=True)
flask 之 请求钩子的更多相关文章
- Flask的请求钩子与上下文简览
请求钩子(Hook) 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:在请求开始时,建立数据库连接:在请求结束时,指定数据的交互格式.为了让>每个视图函数避免编写重复功能的代 ...
- Flask 中请求钩子的理解和应用?
请求钩子是通过装饰器的形式实现的,支持以下四种:1,before_first_request 在处理第一个请求前运行2,before_request:在每次请求前运行3,after_request:如 ...
- flask之请求钩子
from flask import Flask from flask import abort app = Flask(__name__) # 在第一次请求之前调用,可以在此方法内部做一些初始化操作 ...
- flask基础之请求钩子(十二)
前言 什么是请求钩子?在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要统一处理,为了让每个视图函数避免编写重复功能的代码,flask提供了统一的接口可以添加这些处理函数,即请求钩子. 请求钩子 ...
- (三)flask中的请求钩子函数
请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个视图 ...
- flask请求钩子、HTTP响应、响应报文、重定向、手动返回错误码、修改MIME类型、jsonify()方法
请求钩子: 当我们需要对请求进行预处理和后处理时,就可以用Flask提供的回调函数(钩子),他们可用来注册在请求处理的不同阶段执行的处理函数.这些请求钩子使用装饰器实现,通过程序实例app调用,以 b ...
- 02 flask 请求钩子、异常捕获、上下文、Flask-Script 扩展、jinja2 模板引擎、csrf防范
一 请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: 在请求开始时,建立数据库连接: 在请求开始时,根据需求进行权限校验: 在请求结束时,指定数据的交互格式: 为了让每个 ...
- Flask框架 之上下文、请求钩子与Flask_Script
一.上下文 请求上下文:request与session 应用上下文:current_app与g:一次请求多个函数可以用它传参 @app.route("/") def index() ...
- flask中请求勾子
请求勾子 在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如: *在请求开始时,建立数据库连接; *在请求开始时,根据需求进行权限校验; *在请求结束时,指定数据的交互格式; 为了让每 ...
随机推荐
- multipass指定virualbox搭建k8s集群(选择docker作为默认容器)
目录 前言 步骤 初始化三台虚拟机 统一安装docker 修改docker镜像源 查看masterIP 安装master节点(重点设置) 查看master的token 安装worker节点 测试 部署 ...
- Python之struct模块
面对网络协议,在组包拆包时,python提供了struct模块,它可以帮助我们在python值和C语言的结构体之间相互转换,下面一起来了解struct的具体用法. 假设,我们的网络协议为消息id(un ...
- AWS使用ALB负载均衡遇到的问题
文章原文 问题描述 ALB 负载均衡 RGC-Dev-ALB.xxx.cn-north-1.elb.amazonaws.com.cn 解析到2个IP 54.223.xxx.xx和52.81.xxx.x ...
- springmvc图片上传、json
springmvc的图片上传 1.导入相应的pom依赖 <dependency> <groupId>commons-fileupload</groupId> < ...
- app自动化定位:UIautomation的用法
UIautomation定位的优点: 速度比xpath定位快,UIautomation是Android的工作引擎 缺点: 没有idea提示 UIautomation使用方法: AndroidDrive ...
- vim的配置文件
网上一个比较常见的配置文件设置如下,这个配置还是很棒的,尤其创建脚本或者c文件时 " All system-wide defaults are set in $VIMRUNTIME/debi ...
- throw关键字
1.基础用法 2.方法中加合法校验,告知方法的调用者 数组越界判断 3.一切皆为对象,创建的是运行期对象,则可以不处理(throws/try catch),直接交给JVM处理(打印并终止程序) 4.O ...
- (7)java Spring Cloud+Spring boot+mybatis企业快速开发架构之SpringCloud-Spring Boot Starter的介绍及使用
Spring Boot 的便利性体现在,它简化了很多烦琐的配置,这对于开发人员来说是一个福音,通过引入各种 Spring Boot Starter 包可以快速搭建出一个项目的脚手架推荐分布式架构源 ...
- 第一类值VS第二类值
数据类型的分类:第一类值VS第二类值 第一类值:变量中可以存储函数,也就是说func类似int/double. 第二类值: 1.不能存储函数,不能动态创建函数,不能动态销毁函数; 2.只能存储一个指向 ...
- Spring框架(第二天)
一. 注入 a) set i. JDK 1.八种基本类型(+包装类)+String <bean id="User" class="com.dsl.test2.Us ...