举例
模板渲染
template_rendered信号是Flask核心信号。
当一个模版成功地渲染,这个信号会被发送。这个信号与模板实例 template 和上下文的词典(名为 context )一起调用。
信号发送:
def _render(template, context, app):
"""Renders the template and fires the signal"""
rv = template.render(context)
template_rendered.send(app, template=template, context=context)
return rv
订阅示例:
def log_template_renders(sender, template, context, **extra):
sender.logger.debug('Rendering template "%s" with context %s',
template.name or 'string template',
context)
from flask import template_rendered
template_rendered.connect(log_template_renders, app)
帐号追踪
user_logged_in是Flask-User中定义的信号,当用户成功登入之后,这个信号会被发送。
发送信号:
# Send user_logged_in signal
user_logged_in.send(current_app._get_current_object(), user=user)
下面这个例子追踪登录次数和登录IP:
# This code has not been tested
from flask import request
from flask_user.signals import user_logged_in
@user_logged_in.connect_via(app)
def _track_logins(sender, user, **extra):
user.login_count += 1
user.last_login_ip = request.remote_addr
db.session.add(user)
db.session.commit()
小结
信号可以让你在一瞬间安全地订阅它们。例如,这些临时的订阅对测试很有帮助。使用信号时,不要让信号订阅者(接收者)发生异常,因为异常会造成程序中断。










