在Flask中,如何在blueprint中接受signals
我使用flask_login管理登陆用户session,为了给登陆用户写日志,决定使用signals.代码如下:
@user_logged_in.connect_via(app)
def log_info(sender, user, **kw):
print 'test in log info'
current_app.behavior_logger.info(u'[login]%s login' % user.name)
然而该代码只能在有app变量的python文件中生效,在blueprint中无效。
我尝试app = current_app
或者app = xx_blueprint
均无效。
请问flask api文档中说的singals sender 是指什么,如何在blueprint中接受signal呢
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
Flask 文档中的那些 signals,它们的发送都是当前 flask app,因此,当你连接到
request_started
一类的 flask 框架级内置信号时,flask app 会向 receiver 发送信号。此时的 sender 就是
app
,就是那个app = flask.Flask(__name__)
的 app 对象。 receiver,就是注册到信号接收者列表中的函数们。注意:
对于内置信号,当你注册好了以后,app 启动了以后,flask 会在相应的场景下主动 send,而不需要你手动 send,比如
request_started
,当请求开始时它就会发。内置信号之外的,你得自己来控制何时 send。
sender 必须是你 receiver 函数指定的同一对象。
回头来看题主的问题。
你的
@user_logged_in.connect_via(app)
将 app 设置为了 sender。你改成
app = current_app
或者app = xx_blueprint
肯定都是无效的,因为一来前面那个current_app
并没有 send 什么出去,二来后面的xx_blueprint
又不是connect_via(app)
处的app
。so,如何在 blueprint 里接收信号呢?
connect_via(app)
的第一个参数需要改为你的 blueprint 对象在这个 blueprint 对象的相关上下文中 send 消息
比如: