2015-10-16 23 views
9

Jaki jest poprawny sposób podnoszenia mojego obiektu mongo w moich Blueprintach?Plany, PyMongo w kolbie

Oto jak mam rodzica 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) 

w moim child.py

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

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

child2.py jest taka sama konstrukcja jak dziecko:

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

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

Tutaj jest komunikat o błędzie :

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

Próbowałem następujących w plan

mongo = app.data.driver 

ale to daje:

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

Gdy moja aplikacja została stworzona z połączenia, w jaki sposób należy go podnieść w moich ideowych ?

Oto pełna ślad

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" 

Więc pytanie brzmi, w jaki sposób jedna struktura ciągi połączeń do DB w każdym z planów. Oto struktura plików:

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

Oto 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 

Próbowałem sugestię poniżej w odpowiedzi, ale to nie działa. Zobacz moje komentarze poniżej tej potencjalnej odpowiedzi.

+0

proszę [edytuj] aby utworzyć [mcve], w tym * ful l * traceback, a nie tylko komunikat o błędzie. – davidism

+0

Czy masz 'mongo = PyMongo (app)' w login.py i child.py? –

+0

Czy możesz nam pokazać strukturę plików swojego projektu? – skyline75489

Odpowiedz

5

Jedna z kwestii związanych z podejściem polegającym na wykonaniu importu w projekcie, jak sugerował Emanuel Ey, okazuje się, że powoduje on cykliczny import.Po wielu grania, okazuje się, że jedynym sposobem (nie mogłem znaleźć) było stworzenie osobnego pliku o nazwie database.py, który łączy się z bazą danych, a następnie można zaimportować tego połączenia przez plan następująco:

child.py 

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

i moja database.py

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

a aplikacja, login.py ale musi Inicjalizuj bazę

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

Możesz chcieć uogólnić to jeszcze bardziej, zmieniając database.py na settings.py i ustawiając tam różne elementy konfiguracji. – ranman

2

Inicjujesz sterownik PyMongo dwa razy, raz w child.py i po raz drugi na child2.py.

Spróbuj inicjowania połączenia PyMongo w pliku, który tworzy swoją aplikację obiekt, a następnie zaimportować je u dzieci:

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) 

w child.py

from app import app, mongo 

child = Blueprint('child', __name__) 

child2.py:

from app import app, mongo 

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

Import nie powiedzie się, tzn. Podczas próby 'z aplikacji importującej aplikacje, mongo', tak jak:' z importu aplikacji mongo jako mongo', z następującym problemem: 'ImportError: nie można zaimportować nazwy 'mongo'' – disruptive

+0

Również aplikacja, konfiguracja jest przed 'app = Flask (__name __)' – disruptive