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