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 方法的所有几种模式。我创建了一个新的数据库用户,与 mongoHQ 为 heroku 的生产访问创建的一个不同 -> 相同。

这是一个烧瓶应用程序,但我认为没有任何应用程序代码被触及。

更新

我找到了解决方案,但它会引起一些头痛。我可以通过手动连接到数据库

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:set配置 var 将重新启动应用程序。

于 2012-12-29T21:02:34.333 回答