11

私は e コマース サイトのサインアップ/サインイン システムを作成しており、フラスコ セキュリティ ( 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_datastore とセキュリティ オブジェクトを views.py モジュールにインポートする必要があります。

from app.signup import user_datastore, security

問題は、上記の import ステートメントをビュー モジュールに含めるとすぐに、アプリ全体がクラッシュし、単体テストまたは動作テストを実行しようとすると次のトレースバック エラーが発生することです (読みやすくするために編集されています)。

======================================================================
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'

これが何を意味するのかわかりません。フラスコセキュリティのドキュメントを読んでみましたが、なぜそれが起こっているのかわかりません。これを刺してくれる人に感謝します!

4

2 に答える 2

16

簡単な回答:ウィンカーライブラリ がありません。EDIT : 仮想環境でウィンカーが見つからないことを確認し、再インストールしました。

長い答え:

エラーは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ただし、Flask-Security コードも、使用する前にチェックする必要があると思いますconnect_via

于 2013-12-04T17:59:28.187 に答える
0

未来のインターネットの人々へ:

同じエラーが発生しましたが、原因は異なります。私はanacondaの仮想環境を使用しています.flaskの自動リロードシステムと競合していると思います(一度正しくロードできず、エラーを修正してもbinder.pyファイルを編集しても何も変わりませんでした)。新しいコンソールを開いて実行すると修正されました。

申し訳ありませんが、提供できる情報がこれ以上ありませんが、誰かの役に立てば幸いです。

于 2019-06-05T18:39:53.757 に答える