1

Heroku の Python コンソールを介して MongoHQ データベースとやり取りしようとすると、「ログインが必要です」というエラーが表示されます。

...
File "/app/.heroku/venv/lib/python2.7/site-packages/pymongo/helpers.py", line 128, in _check_command_response
    raise OperationFailure(msg % response["errmsg"])
pymongo.errors.OperationFailure: command SON([('listDatabases', 1)]) failed: need to login

私の適用コード

アプリ/初期化.py:

from mongoengine import connect
import settings

db = connect(settings.DB, host=settings.DB_HOST, port=settings.DB_PORT, username=settings.DB_USER, password=settings.DB_PASS)

アプリ/settings.py:

if 'MONGOHQ_URL' in os.environ:
url = urlparse(os.environ['MONGOHQ_URL'])
DB = url.path[1:]
DB_HOST = url.hostname
DB_PORT = url.port
DB_USER = url.username
DB_PASS = url.password

os.environ['MONGOHQ_URL'] は次のようになります:

'mongodb://[username]:[password]@[host]:[port]/[db-name]'

このコードは、ローカルでも heroku Web サーバーからでも機能します (mongodb に接続して読み書きできます)。

ドキュメント (http://www.mongodb.org/display/DOCS/Connections) によると、ユーザー名とパスワードのパラメーターが Connection に渡されるか解析可能である限り、サーバーへの接続で「ログイン」試行を行う必要があります。 URIから。ログイン試行が行われ、黙って失敗したかどうかを確認する方法が思いつきませんでした。

mongoengine をバイパスして pymongo.Connection を使用してみましたが、同じ結果が得られました。Connection メソッドを使用するいくつかのパターンをすべて試しました。herokuの本番アクセス用にmongoHQが作成するものとは異なる、新しいデータベースユーザーを作成しました->同じです。

フラスコアプリですが、アプリのコードは一切手を加えていないと思います。

アップデート

解決策を見つけましたが、頭痛の種になります。データベースに手動で接続できます

conn = connect(settings.DB, host=settings.DB_HOST, port=settings.DB_PORT, username=settings.DB_USER, password=settings.DB_PASS)
db = conn[settings.DB]
db.authenticate(settings.DB_USER, settings.DB_PASS)
アップデート #2

Mongolab はすぐに使えるようになりました。

4

2 に答える 2

2

接続にはURIメソッドを使用し、hostkwargを介して情報を渡します。例:

connect("testdb_uri", host='mongodb://username:password@localhost/mongoenginetest')
于 2012-09-03T13:11:33.590 に答える
0

MongoHQ アドオンは、実際のパスワードではなくパスワード ハッシュを使用しており、それがおそらくエラーです。

MONGOHQ_URL次のコマンドを使用して、環境変数を実際のパスワードに変更する必要があります。

heroku config:set MONGOHQ_URL=mongodb://...

設定したら、アプリケーションを再起動して ( heroku apps)、変更を有効にすることができます。失敗したアプリケーションのディレクトリにいる場合、構成変数をconfig:seting するとアプリケーションが再起動します。

于 2012-12-29T21:02:34.333 に答える