一般来说,钩子用于改变行为(比如,身份验证或错误处理),而信号用于记录事件(比如记录日志)。
一个最小的应用
from flask import Flask
app = Flask(__name__)
@app.route('/')
def hello_world():
return 'Hello World!'
if __name__ == '__main__':
app.run()
信号
官方教程
自定义信号
pip install blinker
from blinker import Namespace
my_signals = Namespace()
model_saved = my_signals.signal('model-saved')
def fire(sender):
print(sender)
print("📶信号触发")
model_saved.connect(fire, sender=1)
model_saved.send()
class A:
def __init__(self):
self.a = 1
model_saved.send(A())
model_saved.send(1)
Flask 自带信号
from flask import got_request_exception, Flask, request_started, request_finished
def request_exception_log(sender, exception, **extra):
print("ex {}".format(exception))
def request_start_log(sender, **extra):
print("start {}".format(sender))
def request_finish_log(sender, response, **extra):
print("finish {}".format(response))
got_request_exception.connect(request_exception_log)
request_started.connect(request_start_log)
request_finished.connect(request_finish_log)
app = Flask(__name__)
@app.route("/")
def hello():
# 1 / 0
return "hello"
if __name__ == '__main__':
app.run(debug=True)
核心信号
注意 ⚠️ 确保订阅使用了一个额外的 **extra 参数,这样当 Flask 对信号引入新参数时你的调用不会失败。
很困 溜了。🎸
%E4%B8%80%E8%88%AC%E6%9D%A5%E8%AF%B4%EF%BC%8C%E9%92%A9%E5%AD%90%E7%94%A8%E4%BA%8E%E6%94%B9%E5%8F%98%E8%A1%8C%E4%B8%BA%EF%BC%88%E6%AF%94%E5%A6%82%EF%BC%8C%E8%BA%AB%E4%BB%BD%E9%AA%8C%E8%AF%81%E6%88%96%E9%94%99%E8%AF%AF%E5%A4%84%E7%90%86%EF%BC%89%EF%BC%8C%E8%80%8C%E4%BF%A1%E5%8F%B7%E7%94%A8%E4%BA%8E%E8%AE%B0%E5%BD%95%E4%BA%8B%E4%BB%B6%EF%BC%88%E6%AF%94%E5%A6%82%E8%AE%B0%E5%BD%95%E6%97%A5%E5%BF%97%EF%BC%89%E3%80%82%0A%0A%3E%20%E4%B8%80%E4%B8%AA%E6%9C%80%E5%B0%8F%E7%9A%84%E5%BA%94%E7%94%A8%0A%0A%60%60%60python%0Afrom%20flask%20import%20Flask%0Aapp%20%3D%20Flask(__name__)%0A%0A%40app.route('%2F')%0Adef%20hello_world()%3A%0A%20%20%20%20return%20'Hello%20World!'%0A%0Aif%20__name__%20%3D%3D%20'__main__'%3A%0A%20%20%20%20app.run()%0A%60%60%60%0A%0A%3E%20%E4%BF%A1%E5%8F%B7%0A%0A%5B%E5%AE%98%E6%96%B9%E6%95%99%E7%A8%8B%5D(http%3A%2F%2Fdocs.jinkan.org%2Fdocs%2Fflask%2Fsignals.html)%0A%0A%3E%20%E8%87%AA%E5%AE%9A%E4%B9%89%E4%BF%A1%E5%8F%B7%0A%0A%60%60%60shell%0Apip%20install%20blinker%0A%60%60%60%0A%0A%60%60%60python%0Afrom%20blinker%20import%20Namespace%0A%0Amy_signals%20%3D%20Namespace()%0A%0Amodel_saved%20%3D%20my_signals.signal('model-saved')%0A%0A%0Adef%20fire(sender)%3A%0A%20%20%20%20print(sender)%0A%20%20%20%20print(%22%F0%9F%93%B6%E4%BF%A1%E5%8F%B7%E8%A7%A6%E5%8F%91%22)%0A%0A%0Amodel_saved.connect(fire%2C%20sender%3D1)%0A%0Amodel_saved.send()%0A%0A%0Aclass%20A%3A%0A%20%20%20%20def%20__init__(self)%3A%0A%20%20%20%20%20%20%20%20self.a%20%3D%201%0A%0A%0Amodel_saved.send(A())%0A%0Amodel_saved.send(1)%0A%60%60%60%0A%0A%3E%20Flask%20%E8%87%AA%E5%B8%A6%E4%BF%A1%E5%8F%B7%0A%0A%60%60%60python%0Afrom%20flask%20import%20got_request_exception%2C%20Flask%2C%20request_started%2C%20request_finished%0A%0A%0Adef%20request_exception_log(sender%2C%20exception%2C%20**extra)%3A%0A%20%20%20%20print(%22ex%20%7B%7D%22.format(exception))%0A%0A%0Adef%20request_start_log(sender%2C%20**extra)%3A%0A%20%20%20%20print(%22start%20%7B%7D%22.format(sender))%0A%0A%0Adef%20request_finish_log(sender%2C%20response%2C%20**extra)%3A%0A%20%20%20%20print(%22finish%20%7B%7D%22.format(response))%0A%0A%0Agot_request_exception.connect(request_exception_log)%0Arequest_started.connect(request_start_log)%0Arequest_finished.connect(request_finish_log)%0A%0Aapp%20%3D%20Flask(__name__)%0A%0A%0A%40app.route(%22%2F%22)%0Adef%20hello()%3A%0A%20%20%20%20%23%201%20%2F%200%0A%20%20%20%20return%20%22hello%22%0A%0A%0Aif%20__name__%20%3D%3D%20'__main__'%3A%0A%20%20%20%20app.run(debug%3DTrue)%0A%60%60%60%0A%0A%3E%20%5B%E6%A0%B8%E5%BF%83%E4%BF%A1%E5%8F%B7%5D(http%3A%2F%2Fdocs.jinkan.org%2Fdocs%2Fflask%2Fsignals.html%23id6)%0A%0A%0A%E6%B3%A8%E6%84%8F%20%E2%9A%A0%EF%B8%8F%20%E7%A1%AE%E4%BF%9D%E8%AE%A2%E9%98%85%E4%BD%BF%E7%94%A8%E4%BA%86%E4%B8%80%E4%B8%AA%E9%A2%9D%E5%A4%96%E7%9A%84%20%60**extra%60%20%E5%8F%82%E6%95%B0%EF%BC%8C%E8%BF%99%E6%A0%B7%E5%BD%93%20Flask%20%E5%AF%B9%E4%BF%A1%E5%8F%B7%E5%BC%95%E5%85%A5%E6%96%B0%E5%8F%82%E6%95%B0%E6%97%B6%E4%BD%A0%E7%9A%84%E8%B0%83%E7%94%A8%E4%B8%8D%E4%BC%9A%E5%A4%B1%E8%B4%A5%E3%80%82%0A%0A%E5%BE%88%E5%9B%B0%20%E6%BA%9C%E4%BA%86%E3%80%82%F0%9F%8E%B8
评论
发表评论