2012-10-20 30 views
6

MongoHQ Heroku eklentisiyle sorun yaşıyorum. Yerel olarak benim app çalışır ve os değişken Heroku üzerinde mevcut ve iyi biçimlendirilmiş. Ancak, db'ye erişmeye çalıştığımda bir hata atar: OperationFailure: database error: unauthorized db:my_database ns:my_database.cars lock type:0 client:128.62.187.133. Bağlantı dizesini MongoHQ'dan kodlamaya çalışırsam ve yerel olarak çalışırsam, aynı hatayı alırım.Heroku MongoHQ eklentisi ve PyMongo - OperationFailure: veritabanı hatası: yetkisiz

Uygulamam aşağıdaki gibidir:

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

Düzenleme: MongoHQ destek bana yardımcı oldu. Sorun, MongoHQ eklentisi tarafından bana verilen gerçek DB adı yerine my_database veritabanımı çağırıyordu. Ör., db = connection.app52314314. Bu değişiklik düzeltildi.

cevap

3

Bağlandıktan sonra doğrudan DB ile authenticate komutunu çalıştırmanız gerekir. Böyle

deneyin şey: Bu işe yaramazsa

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

, [email protected] e-posta çekinmeyin ve biz özel DB ile size yardımcı olabilir.

+0

Hayır, aynı sorunu 'db.authenticate (...) 'eklediğimde hemen' db = connection.my_database' –

+0

aradıktan sonra size bir e-posta gönderdim. –

+1

E-posta ile cevaplandı. Çözüm db'yi MongoHQ db ile aynı şekilde adlandırmaktı. Tam cevap için Düzenle'ye bakın. –

1

Bunların hepsini yapmanız gerekmez. Sadece yapabilirsiniz:

from pymongo import MongoClient 

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

O sizi otomatik olarak kimlik doğrulaması ve provizyon veritabanına bağlanmak edecek, bağlantı url'nin <url_path> parçası.