小编kha*_*mel的帖子

Flask-Security user_registered信号在Python 3.3中未收到,但在2.7中有效

我正在尝试使用user_registered信号,以便在用户使用flask-security注册时为用户设置默认角色,如以下链接所示:在Flask Security中设置默认角色

在我的搜索中,我可以看到在烧瓶安全性中已经解决了这个问题:没有从烧瓶安全性,Fix - user_registered信号问题获得信号

我已尝试以下方法来证明处理程序是否收到信号而没有任何运气:

@user_registered.connect_via(app)
def user_registered_sighandler(sender, **extra):
    print("print-user_registered_sighandler:", extra)
Run Code Online (Sandbox Code Playgroud)

然而,即使用户注册并且应该发送信号,也不会被调用.

如果它有助于我设置flask-security配置如下:

app.config['SECURITY_REGISTERABLE'] = True
app.config['SECURITY_CONFIRMABLE'] = False
app.config['SECURITY_SEND_REGISTER_EMAIL'] = False
app.config['SECURITY_CHANGEABLE'] = True
app.config['SECURITY_SEND_PASSWORD_CHANGE_EMAIL'] = False
Run Code Online (Sandbox Code Playgroud)

来自Flask-Login和Flask-Principal的信号正在为我工​​作,因为我设法确认以下代码片段在发送信号时成功打印:

@user_logged_out.connect_via(app)
def on_user_logged_out(sender, user):
    print('USER LOG OUT: made it in',user)

@identity_changed.connect_via(app)
def identity_changed_ok(sender,identity):
    print('Identity changed:',identity)
Run Code Online (Sandbox Code Playgroud)

对于我的设置,我使用python 3.3(anaconda)并使用以下内容:Flask == 0.10.1,flask-login == 0.2.11,flask-principal == 0.4.0,flask-security == 1.7.4,信号灯== 1.3.看了瓶子登录和烧瓶安全的信号,我不知道为什么烧瓶安全信号不起作用.

编辑:

如果我print(user_registered.receivers)在我的应用程序中添加路线,它将显示我有一个接收器:{139923381372400: <function user_registered_sighandler at 0x7f42737145f0>}.如果我把这个相同的print语句放在flask-security的registerable.py之前,user_registered.send(app._get_current_object(),user=user, confirm_token=token)那么它就没有列出接收器:{}

EDIT2:

问题似乎与使用python 3.3有关.我创建了一个python 2.7环境,user_registered代码按预期工作.

完整代码重现:

from …
Run Code Online (Sandbox Code Playgroud)

python flask flask-security blinker

12
推荐指数
1
解决办法
981
查看次数

在__init__.py和同一目录中导入模块时,python 2.7和3.3+之间的区别

最近我遇到了一个问题,即我在flask-security中使用信号在python 3.3中表现不如预期.在查看flask-security的源代码时,我注意到我从flask-security包中的模块导入的信号也被导入了__init__.py.通过从包的顶层导入信号,我能够解决我的问题(因为在初始化包时导入信号).

如果我运行以下代码:

from flask.ext.security import user_registered
from flask.ext.security.signals import user_registered as user_reg_sig
user_registered==user_reg_sig
Run Code Online (Sandbox Code Playgroud)

我将进入Truepython 2.7,我将获得Falsepython 3.3+.

python 3.3+有什么不同导致导入行为的这种差异?

编辑: 我仍然由Python 2.7 VS 3.3+的问题难住了,但已成功地缩小了,当问题发生__init__.pyflask.ext被称为并使用ExtensionImporter类从exthook.py进口瓶的安全性.

在python 3.4下运行以下命令会在True直接导入flask-security时返回,避免使用扩展钩子:

from flask_security.signals import user_registered as user_reg_sig
from flask_security import user_registered
user_registered==user_reg_sig
Run Code Online (Sandbox Code Playgroud)

这里有关于flask.ext.security和flask_security示例的信号的repr():

from flask_security.signals import user_registered as user_reg_sig
from flask_security import user_registered

repr(user_registered)
>>> "<blinker.base.NamedSignal object at 0x7fb38e258400; 'user-registered'>"

repr(user_reg_sig)
>>> "<blinker.base.NamedSignal object at 0x7fb38e258400; 'user-registered'>" …
Run Code Online (Sandbox Code Playgroud)

python python-import flask python-3.x flask-security

8
推荐指数
1
解决办法
492
查看次数