2013-03-27 11 views
5

Witam Mam małą aplikację kolby, którą wdrażam do heroku.kolba mongoengine łączą się przez uri

Moja lokalna konfiguracja wygląda następująco:

from flask import Flask 
from flask.ext.mongoengine import MongoEngine 

app = Flask(__name__) 
app.debug = True 
app.config["MONGODB_SETTINGS"] = {'DB': "my_app"} 
app.config["SECRET_KEY"] = "secretpassword" 

db = MongoEngine(app) 

Tak, wiem, że muszę skonfigurować aplikację do korzystania z Mongo URI metodę połączenia i mam informacje Connection:

mongodb://<user>:<password>@alex.mongohq.com:10043/app12345678 

Po prostu trochę utknąłem w kwestii składni modyfikującej moją aplikację, aby połączyć się przez URI.

Każda pomoc będzie mile widziana.

Odpowiedz

5

Więc mam to działa (wreszcie):

from flask import Flask 
from mongoengine import connect 

app = Flask(__name__) 

app.config["MONGODB_DB"] = 'app12345678' 
connect(
    'app12345678', 
    username='heroku', 
    password='a614e68b445d0d9d1c375740781073b4', 
    host='mongodb://<user>:<password>@alex.mongohq.com:10043/app12345678', 
    port=10043 
) 

Choć przewidywać, że różne inne konfiguracje będą działać.

+0

Skąd się wzięła nazwa użytkownika i hasło? –

+0

nazwa użytkownika/hasło pochodzi z konta mongohq: utwórz darmowe konto sandbox, aw Bazach danych-> Admin-> Użytkownik utwórz nazwę użytkownika/hasło dla bazy danych.Następnie w obszarze Bazy danych-> Kolekcje kliknij opcję "Połącz bezpośrednio z bazą danych" i spróbuj najpierw polecenia mongo. Następnie skopiuj informacje o użytkowniku/przebiegu i aplikacji do rozwiązania zamieszczonego tutaj. – antimatter

+0

Jeśli nadal chcesz uzyskać klasę opakowania MongoEngine, zobacz moją odpowiedź na Twój wpis :) – antimatter

3

Kiedy patrzysz na flask-mongoengine code można zobaczyć, jakie zmienne konfiguracyjne są dostępne

Tak to powinno działać:

app.config["MONGODB_HOST"] = 'alex.mongohq.com/app12345678' 
app.config["MONGODB_PORT"] = 10043 
app.config["MONGODB_DATABASE"] = 'dbname' 
app.config["MONGODB_USERNAME"] = 'user' 
app.config["MONGODB_PASSWORD"] = 'password' 
db = MongoEngine(app) 

Nie jestem pewien, czy jest to aplikacja app123 lub nazwa bazy danych . Być może będziesz musiał trochę skrzypić, aby uzyskać połączenie. Miałem ten sam problem z Mongokit + MongoLab na Heroku :)

Możesz również użyć identyfikatora URI w ten sposób.

app.config["MONGODB_SETTINGS"] = {'DB': "my_app", "host":'mongodb://<user>:<password>@alex.mongohq.com:10043/app12345678'} 

I rzeczywiście nie ma pojęcia, w jakim punkcie „MONGODB_SETTINGS” jest czytana, ale wydawało się do pracy, gdy próbowałem go w powłoce.

+0

Próbowałem 'app.config [ "MONGODB_SETTINGS"] = {"DB": "app12345678", "host": "mongodb: // @ alex.mongohq.com: 10043/app12345678' i różne pochodne ale wciąż nie ma połączenia. heroku daje mi zmienną 'MONGOHQ_URL', więc na pewno to wszystko, czego potrzebuję? –

0

I zorientowali się, jak korzystać z klasy flask.ext.mongoengine.MongoEngine otoki to zrobić zamiast mongoengine.connect():

from flask import Flask 
from flask.ext.mongoengine import MongoEngine 

app = Flask(__name__) 

HOST = '<hostname>' # ex: 'oceanic.mongohq.com' 
db_settings = { 
    'MONGODB_DB': '<database>', 
    'MONGODB_USERNAME': '<username>', 
    'MONGODB_PASSWORD': '<password>', 
    'MONGODB_PORT': <port>, 
} 
app.config = dict(list(app.config.items()) + list(db_settings.items())) 
app.config["MONGODB_HOST"] = ('mongodb://%(MONGODB_USERNAME)s:%(MONGODB_PASSWORD)[email protected]'+ 
           HOST +':%(MONGODB_PORT)s/%(MONGODB_DB)s') % db_settings 

db = MongoEngine(app) 

if __name__ == '__main__': 
    app.run() 

Jeśli używasz mongohq, app.config["MONGODB_HOST"] powinna odpowiadać Mongo URI pod Databases-> Admin-> Przegląd.

Następnie można śledzić MongoDB „s tumblelog tutorial użyciu tej konfiguracji napisać Twoja pierwsza aplikacja nazywa Tumblelog.

Korzystanie ładne obiektu introspekcji Pythona (Python och jak ja miłość ty tak), można zobaczyć, jak klasa MongoEngine wrapper realizuje to:

from flask.ext.mongoengine import MongoEngine 
import inspect 
print(inspect.getsource(MongoEngine)) 
    ... 
    conn_settings = { 
     'db': app.config.get('MONGODB_DB', None), 
     'username': app.config.get('MONGODB_USERNAME', None), 
     'password': app.config.get('MONGODB_PASSWORD', None), 
     'host': app.config.get('MONGODB_HOST', None), 
     'port': int(app.config.get('MONGODB_PORT', 0)) or None 
    } 
    ... 
    self.connection = mongoengine.connect(**conn_settings) 
    ... 
    self.app = app