当前位置:首页 > 引流 > 正文内容

flask钩子函数应用 java钩子函数和回调函数

admin3年前 (2022-10-21)引流622

钩子函数

before_first_request

before_request

after_request

teardown_appcontext

template_filter

context_processor

errorhandler

Flask信号机制

自定义信号

Flask中引用信号

Flask内置信号

内置信号

template_rendered

got_request_exception

钩子函数

钩子函数是在一个事件触发的时候,在系统级捕获到了他,然后做一些操作。一段用以处理系统消息的程序。“钩子”就是在某个阶段给你一个做某些处理的机会;

before_first_request

处理初次请求Flask项目之前执行;

from flask import Flask

app = Flask(__name__)

@app.before_first_request # 只在Flask项目启动之后初次访问的时候执行;

def first_request():

print('before_first_request')

if __name__ == '__main__':

app.run(debug=True, port=80)

before_request

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

from flask import Flask

app = Flask(__name__)

@app.before_request # 每次请求视图函数之前都会执行

def before_request():

print('before_request')

if __name__ == '__main__':

app.run(debug=True, port=80)

after_request

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

from flask import Flask

app = Flask(__name__)

@app.after_request # 每次请求视图函数之后都会执行

def after_request():

print('after_request')

if __name__ == '__main__':

app.run(debug=True, port=80)

teardown_appcontext

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

from flask import Flask

app = Flask(__name__)

@app.teardown_appcontext

def teardown(exc=None):

if exc is None:

db.session.commit()

else:

db.session.rollback()

db.session.remove()

if __name__ == '__main__':

app.run(debug=True, port=80)

template_filter

在使用Jinja2模板的时候自定义过滤器。比如可以增加一个upper的过滤器,jinja2文档里有具体使用方法;

@app.template_filter

def upper_filter(s):

return s.upper()

context_processor

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

@app.context_processor

return {'current_user':'xxx'}

errorhandler

errorhandler接收状态码,可以自定义返回这种状态码的响应的处理方法,只会捕获错误code,正确的比如2xx/3xx都无法使用该功能;

from flask import Flask, abort

app = Flask(__name__)

@app.route('/')

def home():

abort(400) # 手动抛出400错误

return 'home'

@app.errorhandler(400)

def errorHandler(error): # 需要传入一个参数,接收错误信息

print(error)

return '400 Page'

if __name__ == '__main__':

app.run(debug=True, port=80)

Flask信号机制

从Flask 0.6 开始,Flask 中集成支持信号。这种支持是由优秀的 blinker 库提供,并且当它不可用时会优雅地退回。信号是什么?信号通过在核心框架的其它地方或 Flask 扩展的动作发生时的发送通知来帮助你解耦应用,说实话就是一种消息通知的机制;

其实这里的信号就是日常理解的信号,只是一种信息标号,它本身没有什么特殊含义。咱们会事先约定好信号的的含义(定义信号)。通常咱们说的监听信号,是服务器监听信号会什么时候发生;这里使用订阅是相对咱们而言的(因为信号最终是要反映给咱们人看的),像订阅公众账号一样订阅信号,当这类信号发生时,咱们知道发生了什么,那咱们可以知道下一步该做什么了。而Flask信号(signals, or event hooking)允许特定的发送端通知订阅者发生了什么。

自定义信号

from blinker import Namespace

# 定义一个信号

namespace = Namespace() # 生成一个命名空间的对象

login_signal = namespace.signal('login') # 通过namespace来创建一个login的信号通道

# 定义一个当接接到信号之后的处理函数

def login(sender, username):

'''

:param sender: 信号的发送者

:param username: 接收参数

'''

print('%s登录了,是由%s发送的' % (username, sender.__name__))

# 监听信号

login_signal.connect(login)

# 定义一个发送者

def test():

print('cce')

login_signal.send(test, username='cce') # 传入信号的发送者,和参数

Flask中引用信号

// app.py

from flask import Flask, abort, request

from signals import login_signal # 导入信号对象

app = Flask(__name__)

@app.route('/login')

def login():

username = request.args.get('username', None)

if username:

login_signal.send(app,username=username) # 当客户登录了之后发送信号

return '登录成功'

return '请输入客户名'

if __name__ == '__main__':

app.run(debug=True, port=80)

// signals.py

from blinker import Namespace

# 定义一个信号

namespace = Namespace() # 生成一个命名空间的对象

login_signal = namespace.signal('login') # 通过namespace来创建一个login的信号通道

# 定义一个当接接到信号之后的处理函数

def login(sender, username):

'''

:param sender: 信号的发送者

:param username: 接收参数

'''

print('%s登录了,是由%s发送的' % (username, sender)) # cce登录了,是由<Flask 'app'>发送的

# 监听信号

login_signal.connect(login)

Flask内置信号

Flask内置了9种信号,并且,每次触发了相应信号的事件,都会自动发起信号,所以咱们只要定义信号,和监听信号即可;

内置信号

request_started:请求到来前执行;

request_finished:请求结束后执行;

before_render_template:模板渲染前执行;

template_rendered:模板渲染后执行;

got_request_exception:请求执行出现错误异常时执行;

request_tearing_down:请求执行完毕后自动执行(无论成功与否);

appcontext_tearing_down:请求上下文执行完毕后自动执行(无论成功与否);

appcontext_pushed:请求上下文push时执行;

appcontext_popped:请求上下文pop时执行;

message_flashed:调用flask在其中添加数据时,自动触发;

template_rendered

模板渲染后执行;

from flask import Flask, render_template, template_rendered # 导入Flask内置信号

app = Flask(__name__)

def template_rendered_func(sender,*args,**kwargs): # 定义信号处理函数

print(sender)

print(args)

print(kwargs)

template_rendered.connect(template_rendered_func) # 监听信号,查看源码 Flask发送的信号是template_rendered.send(app, template=template, context=context)

@app.route('/login')

def home():

return render_template('home.html')

if __name__ == '__main__':

app.run(debug=True, port=80)

got_request_exception

请求执行出现错误异常时,将异常信息记录在案;

from flask import Flask, render_template, got_request_exception # 导入Flask内置信号

app = Flask(__name__)

def got_request_exception_func(sender,*args,**kwargs): # 定义信号处理函数

print(sender)

print(args)

print(kwargs)

got_request_exception.connect(got_request_exception_func) # 监听信号,此时得到结果{'exception': NameError("name 'request' is not defined",)}

@app.route('/login')

def home():

print(request.cce) # 此处会抛出错误

return render_template('home.html')

if __name__ == '__main__':

app.run(debug=True, port=80)

标签: 函数 java

扫描二维码推送至手机访问。

版权声明:本文中部分文字、图片、音频、视频来源于互联网及公开渠道,仅供学习参考,版权归原创者所有! 如侵犯到您的权益,请及时通知我们!我们将在第一时间内删除。

本文链接:http://www.73ya.com/yinliu/6034.html

分享给朋友:

“flask钩子函数应用 java钩子函数和回调函数” 的相关文章

短视频运营前期都需要做什么 短视频运营都需要做什么

大家都知道,短视频领域的发展前景是很大的,但短视频运营是没有那么容易的。那么要做短视频运营应该做些什么呢?今天我们就一起来看看关于短视频运营前期都需要做什么,短视频运营都需要做什么的相关内容。 短视频运营前期都需要做什么...

如何在抖音上做产品推广 在抖音上推广自己产品的方法

抖音是一个很具有吸引力的软件,而其中的用户群体手机很大的,很多的品牌方都看中了其中的群体,想在抖音做自己产品的推广。那么今天我们就一起来看看关于如何在抖音上做产品推广,在抖音上推广自己产品的方法的相关内容。 如何在抖音上做产品推广 ...

抖音运营要注意哪些 抖音运营需要注意什么

刚开始运营抖音账号是不是都不知道怎么下手呢?其实抖音运营不仅有小技巧,还有一些相关的注意事项,今天我们就一起来看看关于抖音运营要注意哪些,抖音运营需要注意什么的相关内容。 抖音运营要注意哪些  1、不要盲目跟风...

抖音极速版赚钱是真的吗 抖音极速版赚钱领现金

其实现在很多软件能够赚钱,而一些视频软件刷刷就能够赚钱。那么今天我们就一起来看看关于抖音极速版赚钱是真的吗,抖音极速版赚钱领现金的相关内容。 抖音极速版赚钱是真的吗 最近才开始玩抖音极速版赚钱的方式有很多种。...

抖音有没有网页版本,抖音网页最新版本网页变了

最近感觉用户一直在增加,然后用户需求反应也比较多,所以大家就想知道抖音有没有网页版本?那么接下来就跟小编一起来看看抖音的一个最新版本变成什么样了吧。 今日消息,据相关媒体报道,抖音网页版已经上线,抖音的官网页面同时进行了改版,已经可以看视频,并且支持登录、点赞、查看评论、分享视频。而且...

新手小白如何快速上手短视频,轻轻松松学会制作短视频

经常有很多朋友想学做短视频,但自己不会拍摄,不会剪辑,不会运营,能做短视频吗?答案是肯定的,短视频的发展平台越来越快,越来越来的人喜欢短视频,越来越多的人开始分享自己的日常生活,那么新手小白如何快速上手呢?接下来就跟着小编一起来看看吧。 1.首先打开短视频平台刷一百条热门推荐视频全部收...