2012-10-20 14 views
6

Ho problemi con l'addon MongoHQ Heroku. A livello locale la mia app funziona e la variabile os è presente e ben formata su Heroku. Tuttavia, quando provo ad accedere al db, viene generato un errore: OperationFailure: database error: unauthorized db:my_database ns:my_database.cars lock type:0 client:128.62.187.133. Se provo a codificare la stringa di connessione da MongoHQ ed eseguo localmente, ottengo lo stesso errore.Heroku MongoHQ add-on e PyMongo - OperationFailure: errore del database: non autorizzato

La mia app è qui sotto:

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) 
    ... 

Edit: supporto MongoHQ mi ha aiutato. Il problema era che stavo chiamando il mio database my_database invece del nome effettivo del DB che mi ha dato l'addon MongoHQ. Ad esempio, db = connection.app52314314. Quel cambiamento l'ha risolto.

risposta

3

Probabilmente è necessario eseguire il comando authenticate sul DB direttamente dopo la connessione.

provare qualcosa di simile:

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

Se questo non funziona, si sentono liberi di posta elettronica [email protected] e noi possiamo aiutare con la vostra specifica DB.

+0

No, lo stesso problema quando inserisco la chiamata 'db.authenticate (...)' immediatamente dopo 'db = connection.my_database' –

+0

Ti ho inviato una email. –

+1

Risposta via email. La soluzione era di nominare il db lo stesso del db MongoHQ. Vedi Modifica per la risposta completa. –

1

Non è necessario fare tutto ciò. Si può semplicemente:

from pymongo import MongoClient 

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

Sarà automaticamente l'autenticazione, e la connessione al database provisioning, la <url_path> parte del vostro URL di collegamento.

Problemi correlati