Heroku MongoHQ附加组件和PyMongo - OperationFailure:数据库错误:未经授权

时间:2012-10-20 01:54:28

标签: python mongodb heroku flask mongohq

我遇到了MongoHQ Heroku插件的问题。本地我的应用程序工作,并且os变量在Heroku上存在且格式良好。但是,当我尝试访问数据库时,它会抛出一个错误:OperationFailure: database error: unauthorized db:my_database ns:my_database.cars lock type:0 client:128.62.187.133。如果我尝试从MongoHQ硬编码连接字符串并在本地运行,我会得到同样的错误。

我的应用程序如下:

import os
import datetime
from flask import Flask
from flask import g
from flask import jsonify
from flask import json
from flask import request
from flask import url_for
from flask import redirect
from flask import render_template
from flask import make_response
import pymongo
from pymongo import Connection
from bson import BSON
from bson import json_util

app = Flask(__name__)
def mongo_conn():
    # Format: MONGOHQ_URL: mongodb://<user>:<pass>@<base_url>:<port>/<url_path>
    if os.environ.get('MONGOHQ_URL'):
        return Connection(os.environ['MONGOHQ_URL'])
    else:
        return Connection()


@app.route('/', methods=['GET', 'POST'])
def hello():
    # Get your DB
    connection = mongo_conn()

    db = connection.my_database

    # Create an object
    car = {"brand": "Ford",
           "model": "Mustang",
           "date": datetime.datetime.utcnow()}

    # Get your collection
    cars = db.cars # crashes
    # Insert it
    cars.insert(car)
    ... 

编辑:MongoHQ支持帮助了我。问题是我正在调用我的数据库my_database而不是MongoHQ插件给我的实际数据库名称。例如,db = connection.app52314314。这个改变修正了它。

2 个答案:

答案 0 :(得分:3)

连接后,您可能需要直接对DB运行authenticate命令。

尝试这样的事情:

db.authenticate([USER], [PASSWORD])

如果这不起作用,请随时发送电子邮件至support@mongohq.com,我们可以帮助您使用特定的数据库。

答案 1 :(得分:1)

你不需要做所有这些。你可以简单地说:

from pymongo import MongoClient

client = MongoClient(os.environ['MONGOHQ_URL'])
mongo_db = client.get_default_database()

它会自动对您进行身份验证,并连接到配置的数据库,即连接网址的<url_path>部分。