从heroku控制台连接到MongoHQ(heroku run python)

时间:2012-08-29 01:19:40

标签: python mongodb heroku mongoengine mongohq

尝试通过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),只要将用户名和密码参数传递给服务器,它就应该尝试连接到服务器“登录”从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刚刚开箱即用。

2 个答案:

答案 0 :(得分:2)

请使用URI方法进行连接,并通过host kwarg传递信息,例如:

connect("testdb_uri", host='mongodb://username:password@localhost/mongoenginetest')

答案 1 :(得分:0)

MongoHQ插件使用密码哈希而非实际密码,这可能是错误。

您应该使用以下命令将环境变量MONGOHQ_URL更改为真实密码:

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

设置完成后,您可以重新启动应用程序(heroku apps),以便获取更改。如果您在失败的应用程序的目录中,config:set config var将重新启动应用程序。