Подключение к MongoHQ из консоли heroku (heroku запускает python)

Я получаю сообщение об ошибке «необходим вход в систему» ​​при попытке взаимодействовать с моей базой данных MongoHQ через консоль Python на героку:

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

Этот код работает (подключается и может читать и писать в mongodb) как локально, так и с веб-сервера heroku.

Согласно документам (http://www.mongodb.org/display/DOCS/Connections), он должен сделать попытку входа в систему при подключении к серверу, если параметры имени пользователя и пароля передаются в Connection или анализируются из УРИ. Я не мог придумать способ увидеть, была ли попытка входа в систему выполнена и провалилась молча.

Я пытался обойти mongoengine и использовать pymongo.Connection и получил тот же результат. Я попробовал все несколько шаблонов использования метода Connection. Я создал нового пользователя базы данных, отличного от того, который 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)
Update #2

Mongolab просто работал из коробки.


person user1479095    schedule 29.08.2012    source источник


Ответы (2)


Пожалуйста, используйте метод URI для подключения и передайте информацию через host kwarg, например:

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

Надстройка MongoHQ использует хэши паролей, а не настоящие пароли, и, возможно, это ошибка.

Вы должны изменить переменную среды MONGOHQ_URL на реальный пароль с помощью следующей команды:

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

После установки вы можете перезапустить свои приложения (heroku apps), чтобы изменения вступили в силу. Если вы находитесь в каталоге сбойного приложения, config:seting config var перезапустит приложение.

person Jacek Laskowski    schedule 29.12.2012