【问题标题】:Heroku MongoHQ add-on and PyMongo -- OperationFailure: database error: unauthorizedHeroku MongoHQ 附加组件和 PyMongo -- OperationFailure: 数据库错误:未授权
【发布时间】:2012-10-10 16:15:51
【问题描述】:

我在使用 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。这个改变解决了它。

【问题讨论】:

    标签: python mongodb heroku flask mongohq


    【解决方案1】:

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

    试试这样的:

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

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

    【讨论】:

    • 不,当我在db = connection.my_database 之后立即插入db.authenticate(...) 调用时,同样的问题
    • 已通过电子邮件答复。解决方案是将数据库命名为与 MongoHQ 数据库相同的名称。请参阅编辑以获取完整答案。
    【解决方案2】:

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

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

    它将自动对您进行身份验证,并连接到配置的数据库,即您的连接 URL 的 &lt;url_path&gt; 部分。

    【讨论】:

      猜你喜欢
      • 2015-08-18
      • 2012-07-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-09
      • 2012-08-09
      • 2012-06-25
      • 2020-11-24
      相关资源
      最近更新 更多