2012-10-20 2 views
6

MongoHQ Heroku 애드온에 문제가 있습니다. 로컬로 내 애플 리케이션 및 os 변수가 존재 하 고 잘 - Heroku에 형성 작동합니다. 그러나 db에 액세스하려고하면 오류가 발생합니다 : OperationFailure: database error: unauthorized db:my_database ns:my_database.cars lock type:0 client:128.62.187.133. MongoHQ에서 연결 문자열을 하드 코딩하여 로컬로 실행하려고하면 같은 오류가 발생합니다.Heroku MongoHQ 애드온 및 PyMongo - OperationFailure : 데이터베이스 오류 : 무단

내 응용 프로그램은 다음과 같습니다 :

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 지원이 나를 도왔다. 문제는 내가 MongoHQ addon에 의해 나에게 주어진 실제 DB 이름 대신에 나의 데이터베이스 my_database을 부르고 있었다는 것이었다. 예 : db = connection.app52314314. 그 변화는 그것을 고쳤다.

답변

3

연결 한 후 데이터베이스에 대해 authenticate 명령을 직접 실행해야 할 수 있습니다. 이 같은

시도 뭔가 : 문제가 해결되지 않으면

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

[email protected] 이메일을 보내 주시기 바랍니다 그리고 우리는 특정 DB에 당신을 도울 수 있습니다.

+0

'db = connection.my_database' 바로 다음에'db.authenticate (...)'호출을 삽입 할 때와 같은 문제가 없습니다. –

+0

이메일을 보냈습니다. –

+1

이메일로 답변드립니다. 해결 방법은 DB 이름을 MongoHQ db와 동일하게 지정하는 것입니다. 전체 답변 편집을 참조하십시오. –

1

이 모든 작업을 수행 할 필요는 없습니다. 당신은 간단하게 할 수 있습니다

from pymongo import MongoClient 

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

그것은 자동으로 인증 및 프로비저닝 데이터베이스에 연결, 연결 URL의 <url_path> 부분.