Я получаю сообщение об ошибке «необходим вход в систему» при попытке взаимодействовать с моей базой данных 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 просто работал из коробки.