Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >Python + Flask 常用的钩子函数

Python + Flask 常用的钩子函数

作者头像
Wu_Candy
发布于 2022-07-04 13:33:30
发布于 2022-07-04 13:33:30
82900
代码可运行
举报
文章被收录于专栏:无量测试之道无量测试之道
运行总次数:0
代码可运行

1.名词解释

钩子函数是指在执行函数和目标函数之间挂载的函数,框架开发者给调用方提供一个point-挂载点,至于挂载什么函数由调用方决定。

@before_first_request

在对应用程序实例的第一个请求之前注册要运行的函数,只会运行一次。

@before_request

在每个请求之前注册一个要运行的函数,每一次请求都会执行一次。

@after_request

在每个请求之后注册一个要运行的函数,每次请求完成后都会执行。需要接收一个 Response 对象作为参数,并返回一个新的 Response 对象,或者返回接收的 Response 对象。

@teardown_request

注册在每一个请求的末尾,不管是否有异常,每次请求的最后都会执行。

@context_processor

上下文处理器,返回的字典可以在全部的模板中使用。

@template_filter('upper')

增加模板过滤器,可以在模板中使用该函数,后面的参数是名称,在模板中用到。

@errorhandler(400)

发生一些异常时,比如404,500,或者抛出异常(Exception)之类的,就会自动调用该钩子函数。

1.发生请求错误时,框架会自动调用相应的钩子函数,并向钩子函数中传入error参数。

2.如果钩子函数没有定义error参数,就会报错。

3.可以使用abort(http status code)函数来手动终止请求抛出异常,如果要是发生参数错误,可以abort(404)之类的。

@teardown_appcontext

不管是否有异常,注册的函数都会在每次请求之后执行。

flask 为上下文提供了一个 teardown_appcontext 钩子,使用它注册的毁掉函数会在程序上下文被销毁时调用,通常也在请求上下文被销毁时调用。

比如你需要在每个请求处理结束后销毁数据库连接:app.teardown_appcontext 装饰器注册的回调函数需要接收异常对象作为参数,当请求被正常处理时这个参数将是None,这个函数的返回值将被忽略。

2.代码演示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
常见的 http status code: 
200 --OK 
302 --Move Temporarily 
400 --bad request 
401 --Unauthorized 
403 --forbidden 
404 --not found 
500 --interal server error 
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
from flask import Flask,request,render_template,abort,jsonify

app = Flask(name)
error_list=[]

@app.route('/')
def index():
### print(1/0)
### abort(404) #我们可以使用flask.abort手动抛出相应的错误
    return render_template("index.html")

@app.route('/user')
def user():
    user_agent = request.headers.get("User-Agent")
    return f"<h1>Hello World!</h1>\nHello World!{user_agent}"

@app.route('/commit')
def commit():
    return '<form action="/getUser" method="get">  ' \
           '<input type="text" name="username" value="">  ' \
           '<input type="submit" value="提交">  ' \
           '</form>'
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.before_first_request
def before_first_request():
    print("call the before first request of function")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.before_request
def before_request():
    print("call the before request of function")
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.after_request
def after_request(response):
    print("call the after request of function")
    ### print(response.get_json())
    ### print(response.data)
    print(response.headers)
    ### return jsonify({"a": 1})
    return response
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.teardown_request
def teardown_request(error):
    print("call the teardown request of function")
    print("the error is:",error)
    error_list.append(error)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.teardown_appcontext
def teardown_appcontext(exception=None):
    print("call the teardown appcontext of function")
    if(exception is None):
        print("None")
    else:
        print("the exception is:",exception)
        ### db.close();
        ### file.close()
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.route("/get_error")
def get_error():
    print(error_list)
    return str(error_list)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.template_filter("update")
def upper_filter(str):
    print("call the upper filter of function")
    return str.upper()+" good good study"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.context_processor
def context_process():
    print("call the context process of function")
    content = 'flask context manager'
    return dict(content=content)
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.errorhandler(500)
def server_is_exception(error):
    print("*"*100)
    print(error)
    return 'the server is exception',500
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@app.errorhandler(404)
def page_not_found(error):
    print("*" * 50)
    print(error)
    return 'This page does not exist',404

if __name__ == __'main'__:
    app.run()

备注:

Python 文件所在目录创建一个 templates 目录, 放入 index.html 文件,文件内容如下。

index.html文件内容

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--<h2>{{ content }}</h2>-->
<h1>the content = {{ content |update }}</h1>
</body>
</html>

end

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-10-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 无量测试之道 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Flask 学习-67.钩子函数before_request 和 before_first_request 的使用
前言 学过pytest框架的肯定知道什么叫钩子(hook)函数, 钩子函数的作用是在程序运行的过程中插入一段代码做一些事情。 四个钩子 请求钩子是通过装饰器的形式实现,Flask支持如下四种请求钩子: before_first_request      在对应用程序实例的第一个请求之前注册要运行的函数, 只会执行一次 before_request  在每次请求前执行,如果在某修饰的函数中返回了一个响应,视图函数将不再被调用 after_request  如果没有抛出错误,在每次请求后执行接受一个参数:视图函
上海-悠悠
2022/09/19
2.2K0
flask系列八之请求方法、g对象和钩子函数
(2)在写form表单的时候,要指定method='post',并且要指定action='/login/'。
wfaceboss
2019/04/08
5330
Python Flask 编程 | 连载 03 - Flask 请求
应用上下文对象有两个,分别是 current_app 表示当前应用的实例以及 g 表示处理请求时临时存储对象,每次请求都会重设这个变量,并且 g 对象时线程隔离的,使用g对象需要导入,g 既 global。
RiemannHypothesis
2022/09/26
3670
Python Flask 编程 | 连载 03 - Flask 请求
11.Flask钩子函数
     在Flask中钩子函数是使用特定的装饰器的函数。为什么叫做钩子函数呢,是因为钩子函数可以在正常执行的代码中,插入一段自己想要执行的代码,那么这种函数就叫做钩子函数。
zhang_derek
2018/08/01
5930
Flask入门很轻松 (二)
转载请在文章开头附上原文链接地址:https://www.cnblogs.com/Sunzz/p/10959454.html
py3study
2020/01/15
3910
钩子函数
应用目录下创建middlewares包目录,每个功能实现以个中间件(每个功能是一个py文件)
星哥玩云
2022/09/14
4420
Flask 请求钩子
为了让每个视图函数避免编写重复功能的代码,Flask 提供了通用设施的功能,即请求钩子。
忆想不到的晖
2022/05/11
8520
Flask 请求钩子
Flask阶段(一)代码
1.helloworld.py #1.从flask模块导入了Flask类 from flask import Flask #2.创建flask对象 #参数1: __name__,如果从当前文件启动,那么值是__main__, 如果是从其他模块调用运行的那么值是模块的名字 #参数2: static_url_path,表示静态资源的访问地址, /static #参数3: static_folder, 用来存储静态资源的,默认名字是static #参数4: template_folder, 模板文件夹,默认的值
小闫同学啊
2019/07/18
4790
Flask 学习-69.捕获异常钩子函数errorhandler
前言 flask 运行请求出现异常时,会先触发对应的异常钩子,比如出现404时,会根据NotFound 异常类返回404状态码。 我们也可以根据捕获异常钩子errorhandler 来自定义异常的输出。 404 NotFound 以404 NotFound 为例,在werkzeug.exceptions中可以找到 class NotFound(HTTPException): """*404* `Not Found` Raise if a resource does not exist an
上海-悠悠
2022/09/19
1.6K0
Flask 学习-69.捕获异常钩子函数errorhandler
Python Web - Flask笔记8
CSRF(Cross Site Request Forgery)跨站域请求伪造是一种网络攻击方式。
YingJoy_
2018/08/02
1.3K0
python flask web开发实战
路由: @app.route('/') def index(): return '<h1>hello</h1>'
用户5760343
2019/07/05
6240
Flask 中的上下文管理和请求钩子
在使用 Flask 框架实现功能接口的时候,前端点击按钮发送请求的请求方式和 form 表单提交给后端的数据,后端都是通过 Flask 中的 request 对象来获取的。
Python碎片公众号
2021/02/26
1.8K0
Flask 中的上下文管理和请求钩子
flask中请求勾子
在客户端和服务器交互的过程中,有些准备工作或扫尾工作需要处理,比如:     *在请求开始时,建立数据库连接;     *在请求开始时,根据需求进行权限校验;     *在请求结束时,指定数据的交互格式;
py3study
2020/01/19
3890
Hello Flask
Flask是一个使用Python编写的轻量级Web应用框架。基于Werkzeug WSGI工具箱和Jinja2 模板引擎。Flask使用BSD授权。 Flask被称为“microframework”,因为它使用简单的核心,用extension增加其他功能。Flask没有默认使用的数据库、窗体验证工具。然而,Flask保留了扩增的弹性,可以用Flask-extension加入这些功能:ORM、窗体验证工具、文件上传、各种开放式身份验证技术。 Flask英文翻译为瓶子,烧瓶,与另一个web框架Bottle同义,意在表示另一种容器,另一个框架。而且他们两个也有一些相似的地方。
py3study
2020/01/16
1.5K0
Hello Flask
Flask(中间件与全局变量 九)
当Flask应用处理请求时,它会根据从WSGI服务器收到的环境创建一个Request对象.
zx钟
2020/07/07
2.2K0
Flask路由&视图
在浏览器访问127.0.0.1:5000/func1和 127.0.0.1:5000/func2,返回的结果都是func。
py3study
2020/01/16
7350
学习笔记 | Flask学习从入门到放弃(2)
Flask Web学习笔记之Flask与HTTP 2.1 请求响应循环 每一个Web应用都包含这种处理模式:客户端发出请求,服务器端处理请求并返回响应 HTTP是客户端和服务器端沟通的桥梁,当用户点击URL时,浏览器会生成http请求,经互联网发送到对应的web服务器,Web服务器端接收请求,通过WSGI将HTTP格式数据转换成能用的数据,并生成响应又依次返回给客户端 2.2 HTTP请求 2.2.1 报文 常见HTTP方法:GET,POST,PUT,DELETE,HEAD,OPTIONS 2.2.2 Re
Justlovesmile
2021/12/14
8290
web开发框架Flask学习一
flask框架 用Python做Web开发的三大框架特点 Django 主要特点是大而全,集成了很多的组件,例如:Admin Form Model等,不管你用不用的到,他都会为 你提供,通常用于大型Web应用,由于内部组件足够强大,所以使用Django可以做到一气呵成,    Django的优点是大而全,缺点也就露出来,这么多的资源一次性全部加载,肯定会造成cpu资源的浪费 flask
py3study
2020/01/19
7550
Flask 请求钩子
在Django中有中间件这个类来做一些视图执行前、执行中、执行后的一些额外业务处理,那么在Flask则是采用请求钩子的方式来处理。
Devops海洋的渔夫
2019/12/16
8850
Flask 请求钩子
python中flask 常见问题
本文出自https://blog.csdn.net/qq_33020901/article/details/69802445
py3study
2020/01/13
1.7K0
相关推荐
Flask 学习-67.钩子函数before_request 和 before_first_request 的使用
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验