1

I'm getting a 'need to login' error when trying to interact with my MongoHQ database through python console on heroku:

...
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

My applicable code

app/init.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)

app/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'] looks like:

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

This code works (connects and can read and write to mongodb) both locally and from the heroku web server.

According to the docs (http://www.mongodb.org/display/DOCS/Connections), it should at make a 'login' attempt on connection to the server as long as the username and password params are passed to Connection or parseable from the URI. I couldn't think of a way to see if the login attempt was being made and failing silently.

I've tried bypassing mongoengine and using pymongo.Connection and got the same result. I tried all of the several patterns of using the Connection method. I created a new database user, different from the one mongoHQ creates for heroku's production access -> same same.

It's a flask app, but I don't think any app code is being touched.

Update

I found a solution, but it will cause some headaches. I can manually connect to the database by

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)
Update #2

Mongolab just worked out of the box.

user1479095
  • 397
  • 4
  • 7

2 Answers2

2

Please use the URI method for connecting and pass the information to via the host kwarg eg:

connect("testdb_uri", host='mongodb://username:password@localhost/mongoenginetest')
Ross
  • 17,861
  • 2
  • 55
  • 73
0

MongoHQ add-on uses password hashes not actual passwords and that's perhaps the error.

You should change the environment variable MONGOHQ_URL to a real password with the following command:

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

Once set, you may restart your applications (heroku apps) so the change gets picked up. If you're in the directory of the failing application, config:seting the config var will restart the application.

Jacek Laskowski
  • 72,696
  • 27
  • 242
  • 420