2015-10-16 24 views
9

Qual è il modo corretto di raccogliere il mio oggetto mongo nei miei Blueprints?Blueprints, PyMongo in Flask

Ecco come ho il mio genitore login.py:

app.config.from_object('config') 
from flask.ext.pymongo import PyMongo 
from child import child 
from child2 import child2 


app = Flask(__name__) 
app.register_blueprint(child2.child2) 
app.register_blueprint(child.child) 

nel mio child.py

from app import app 
from flask.ext.pymongo import PyMongo 

mongo = PyMongo(app) 
child = Blueprint('child', __name__) 

child2.py è la stessa struttura di bambino:

from app import app 
from flask.ext.pymongo import PyMongo 

mongo = PyMongo(app) 
child2 = Blueprint('child2', __name__) 

Ecco il messaggio di errore :

raise Exception('duplicate config_prefix "%s"' % config_prefix) 
Exception: duplicate config_prefix "MONGO" 

ho provato quanto segue il progetto

mongo = app.data.driver 

ma che dà:

AttributeError: 'Flask' object has no attribute 'data' 

Una volta che la mia app ha creato la connessione, come devo raccoglierlo nei miei progetti ?

Ecco la traccia completa

Traceback (most recent call last): 
    File "login.py", line 12, in <module> 
    from child import child 
    File "/home/xxx/xxx/child/child.py", line 13, in <module> 
    mongo = PyMongo(app) #blueprint 
    File "/home/xxx/xxx/lib/python3.4/site-packages/flask_pymongo/__init__.py", line 97, in __init__ 
    self.init_app(app, config_prefix) 
    File "/home/xxx/xxx/lib/python3.4/site-packages/flask_pymongo/__init__.py", line 121, in init_app 
    raise Exception('duplicate config_prefix "%s"' % config_prefix) 
Exception: duplicate config_prefix "MONGO" 
(xxx)[email protected]:~/xxx$ python login.py 
Traceback (most recent call last): 
    File "login.py", line 12, in <module> 
    from courses import courses 
    File "/home/xxx/xxx/child/child.py", line 13, in <module> 
    mongo = PyMongo(app) #blueprint 
    File "/home/xxx/xxx/lib/python3.4/site-packages/flask_pymongo/__init__.py", line 97, in __init__ 
    self.init_app(app, config_prefix) 
    File "/home/xxx/xxx/lib/python3.4/site-packages/flask_pymongo/__init__.py", line 121, in init_app 
    raise Exception('duplicate config_prefix "%s"' % config_prefix) 
Exception: duplicate config_prefix "MONGO" 

Quindi la domanda è come si può struttura le stringhe di connessione al DB in ciascuno dei progetti. Ecco la struttura dei file:

login.py 
config.py 
/child/child.py 
/child2/child2.py 

ecco il config.py

MONGO_DBNAME = 'xxx' 

MONGO_URL = os.environ.get('MONGO_URL') 
if not MONGO_URL: 
    MONGO_URL = "mongodb://xxx:[email protected]:55822/heroku_xxx"; 

MONGO_URI = MONGO_URL 

Ho provato il suggerimento di seguito in risposte, ma questo non ha funzionato. Vedi i miei commenti sotto quella risposta prospettica.

+0

Si prega di [modifica] per creare un [MCVE], compreso il * Ful l * traceback, non solo il messaggio di errore. – davidism

+0

Hai 'mongo = PyMongo (app)' sia in login.py che child.py? –

+0

Puoi per favore mostrarci la struttura del file del tuo progetto? – skyline75489

risposta

5

Uno dei problemi con l'approccio di eseguire un'importazione nel progetto, come suggerito da Emanuel Ey, risulta che provoca un'importazione circolare.Dopo molto giocare, si scopre che l'unico modo (che ho trovato) era quello di creare un file separato chiamato database.py che si connette al database e quindi mi può importare questa connessione a dal progetto come segue:

child.py 

from database import mongo 
courses = Blueprint('courses', __name__) 

e il mio database.py

from flask.ext.pymongo import PyMongo 
mongo = PyMongo() 

e l'applicazione, login.py ma deve inizializzare il database

from database import mongo 
app = Flask(__name__) 
app.config.from_object('config') 
mongo.init_app(app) # initialize here! 

from child import child 
from child import2 child2 

app.register_blueprint(child.child) 
app.register_blueprint(child2.child2) 
+1

Si consiglia di generalizzarlo ulteriormente cambiando database.py in settings.py e impostando i vari elementi di configurazione lì. – ranman

2

Si sta inizializzando il driver PyMongo due volte, una volta in child.py e una seconda volta su child2.py.

Prova inizializzazione della connessione PyMongo nel file che imposta l'oggetto applicazione e quindi importarlo nei figli:

login.py:

app.config.from_object('config') 
from flask.ext.pymongo import PyMongo 
from child import child 
from child2 import child2 


app = Flask(__name__) 
mongo = PyMongo(app) 

# Register blueprints 
def register_blueprints(app): 
    # Prevents circular imports 
    app.register_blueprint(child2.child2) 
    app.register_blueprint(child.child) 

register_blueprints(app) 

in child.py

from app import app, mongo 

child = Blueprint('child', __name__) 

child2.py:

from app import app, mongo 

child2 = Blueprint('child2', __name__) 
+1

L'importazione fallisce, cioè quando si prova 'dall'app di importazione app, mongo', così come:' dall'app import mongo come mongo', con il seguente problema: 'ImportError: impossibile importare il nome 'mongo'' – disruptive

+0

Anche l'app, config è prima di 'app = Flask (__name __)' – disruptive