将Flask安全实例导入我的视图模块会破坏我的webapp

2024-06-09 10:10:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在为一个电子商务站点编写注册/登录系统,并使用flask security(http://pythonhosted.org/Flask-Security/)来处理注册功能。基本设置的一部分需要以下signup.py模块:

from flask.ext.security import SQLAlchemyUserDatastore, Security
from app.models import User, Role
from app import app, db

# Setup Flask Security
user_datastore = SQLAlchemyUserDatastore(db, User, Role)
security = Security(app, user_datastore)

然后,我必须将user_数据存储和安全对象导入views.py模块,如下所示:

from app.signup import user_datastore, security

问题是,一旦我将上面的import语句包含到我的views模块中,我的整个应用程序就会崩溃,并且当我尝试运行我的单元或行为测试(为可读性而编辑)时,会得到以下回溯错误

======================================================================
ERROR: Failure: AttributeError ('_FakeSignal' object has no attribute 'connect_via')
----------------------------------------------------------------------
Traceback (most recent call last):
  File "/Library/Python/2.7/site-packages/nose/loader.py", line 413, in loadTestsFromName
    addr.filename, addr.module)
  File "/Library/Python/2.7/site-packages/nose/importer.py", line 47, in importFromPath
    return self.importFromDir(dir_path, fqname)
  File "/Library/Python/2.7/site-packages/nose/importer.py", line 94, in importFromDir
    mod = load_module(part_fqname, fh, filename, desc)
  File "/Users/faiyamrahman/programming/Python/WebApps/NibsNWhiskeyFull/tests/test_database.py", line 6, in <module>
    from app import app, db, models
  File "/Users/faiyamrahman/programming/Python/WebApps/NibsNWhiskeyFull/app/__init__.py", line 9, in <module>
    from app import views, models
  File "/Users/faiyamrahman/programming/Python/WebApps/NibsNWhiskeyFull/app/views.py", line 7, in <module>
    from app.signup import user_datastore
  File "/Users/faiyamrahman/programming/Python/WebApps/NibsNWhiskeyFull/app/signup.py", line 7, in <module>
    security = Security(app, user_datastore)
  File "/Users/faiyamrahman/programming/Python/WebApps/NibsNWhiskeyFull/flask/lib/python2.7/site-packages/flask_security/core.py", line 346, in __init__
    self._state = self.init_app(app, datastore, **kwargs)
  File "/Users/faiyamrahman/programming/Python/WebApps/NibsNWhiskeyFull/flask/lib/python2.7/site-packages/flask_security/core.py", line 368, in init_app
    identity_loaded.connect_via(app)(_on_identity_loaded)
AttributeError: '_FakeSignal' object has no attribute 'connect_via'

我不知道这是什么意思。我试过阅读烧瓶安全文档,但我不明白为什么会发生这种情况。多亏有人捅了一刀!


Tags: infrompyimportappflasklineusers
2条回答

简短回答:您缺少blinker库。 编辑:您确认虚拟环境找不到blinker,然后重新安装了它。

长答案:

我认为错误来自Flask Signals。从信号看这个代码:

signals_available = False
try:
    from blinker import Namespace
    signals_available = True
except ImportError:
    class Namespace(object):
        def signal(self, name, doc=None):
            return _FakeSignal(name, doc)

所以我认为代码试图找到blinker库,在您的例子中,它无法导入它,因此它试图使用_FakeSignal类。

_FakeSignal类没有定义如下所示的connect_via属性

class _FakeSignal(object):
    """If blinker is unavailable, create a fake class with the same
    interface that allows sending of signals but will fail with an
    error on anything else.  Instead of doing anything on send, it
    will just ignore the arguments and do nothing instead.
    """

    def __init__(self, name, doc=None):
        self.name = name
        self.__doc__ = doc
    def _fail(self, *args, **kwargs):
        raise RuntimeError('signalling support is unavailable '
                           'because the blinker library is '
                           'not installed.')
    send = lambda *a, **kw: None
    connect = disconnect = has_receivers_for = receivers_for = \
        temporarily_connected_to = connected_to = _fail
    del _fail

Flask Security尝试加载的connect_via属性实际上是由blinker库提供的,由于没有闪烁,因此没有连接。因此它失败了。

所以你应该先安装闪光灯。不过,我认为烧瓶安全代码在尝试使用connect_via之前也应该检查blinker

对于未来的互联网用户:

我犯了同样的错误,但原因不同。我使用的是anaconda的虚拟环境,我认为这与flask的自动重新加载系统相冲突(它未能正确加载一次,修复错误没有改变任何东西,甚至编辑了blinker.py文件)。打开一个新的控制台来运行修复了它。

抱歉,我没有更多的信息可以提供,但希望这能帮助别人。

相关问题 更多 >