尝试通过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刚刚开箱即用。
答案 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将重新启动应用程序。