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

Python 将Flask安全实例导入“我的视图”模块会破坏我的webapp,python,flask,signals,flask-security,blinker,Python,Flask,Signals,Flask Security,Blinker,我正在为一个电子商务站点编写注册/登录系统,并使用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 = SQLAlchemyUser

我正在为一个电子商务站点编写注册/登录系统,并使用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)
然后,我必须将用户_数据存储和安全对象导入my views.py模块,如下所示:

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

======================================================================
错误:失败:AttributeError(“\u FakeSignal”对象没有“connect\u via”属性)
----------------------------------------------------------------------
回溯(最近一次呼叫最后一次):
loadTestsFromName中的文件“/Library/Python/2.7/site packages/nose/loader.py”,第413行
addr.filename,addr.module)
文件“/Library/Python/2.7/site packages/nose/importer.py”,第47行,在importFromPath中
返回self.importFromDir(目录路径,fqname)
importFromDir中的文件“/Library/Python/2.7/site packages/nose/importer.py”,第94行
mod=加载模块(部件名称、fh、文件名、描述)
文件“/Users/faiyamrahman/programming/Python/WebApps/nibsnwhiskyfull/tests/test_database.py”,第6行,在
从应用程序导入应用程序、数据库、模型
文件“/Users/faiyamrahman/programming/Python/WebApps/nibsnwhiskyfull/app/__init__.py”,第9行,在
从应用程序导入视图、模型
文件“/Users/faiyamrahman/programming/Python/WebApps/nibsnwhiskyfull/app/views.py”,第7行,在
从app.signup导入用户_数据存储
文件“/Users/faiyamrahman/programming/Python/WebApps/nibsnwhiskyfull/app/signup.py”,第7行,在
安全=安全(应用程序、用户\数据存储)
文件“/Users/faiyamrahman/programming/Python/WebApps/nibsnwhiskyfull/flask/lib/python2.7/site packages/flask_security/core.py”,第346行,在__
self.\u state=self.init\u应用程序(应用程序、数据存储,**kwargs)
文件“/Users/faiyamrahman/programming/Python/WebApps/nibsnwhiskyfull/flask/lib/python2.7/site packages/flask_security/core.py”,第368行,在init_应用程序中
已加载标识。通过(应用程序)连接(已加载标识)
AttributeError:“\u FakeSignal”对象没有属性“connect\u via”

我不知道这意味着什么。我试过阅读flask安全文档,但我不明白为什么会发生这种情况。感谢所有尝试过这个的人

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

长答案:

我认为错误是来自于。从信号中查看此代码:

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)
因此,我认为代码试图找到
闪烁器
库,在您的情况下,它无法导入它,因此它尝试使用
\u FakeSignal

\u FakeSignal
类没有定义如下所示的
connect\u 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\u via
属性实际上是由
blinker
库提供的,因为没有blinker,所以没有connect\u via。因此它失败了


所以你应该先安装闪光灯。但是,我认为Flask安全代码在尝试使用
通过
连接到未来的互联网用户之前,还应该检查
闪烁器

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


很抱歉,我没有更多的信息要提供,但希望这对某人有所帮助。

嘿,谢谢你的回复。这似乎合理,但我安装了pip和更新了pip的闪烁器。原来我的虚拟环境已经加载了闪烁器。所以我仍然收到相同的错误消息。哪个版本的blinker?我相信你需要1.1或更高版本。我有1.3版的闪光灯。但很明显,烧瓶信号无法导入它,因此它会返回到_fakesignalobject。您需要检查您的虚拟环境。配置等。烧瓶信号应该能够从您收到的此错误消息中找到它无法找到的闪烁器。幸运的是,您可能希望在虚拟环境中直接尝试这种方法:“从blinker导入名称空间”,看看它是否有效
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