【发布时间】:2012-08-23 13:49:00
【问题描述】:
尝试通过 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
我的适用代码
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'] 看起来像:
'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 开箱即用。
【问题讨论】:
标签: python mongodb heroku mongoengine mongohq