2015-10-16 2 views
9

Каков правильный способ поднять мой объект монго в моих чертежах?Чертежи, PyMongo in Flask

Вот как у меня родители 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) 

в моем child.py

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

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

child2.py такого же структура, как ребенок:

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

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

Вот сообщение об ошибке :

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

Я попытался следующим в плане

mongo = app.data.driver 

, но это дает:

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

После того, как мое приложение создает соединение, как я должен забрать его в моих чертежах ?

Вот полный след

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" 

Таким образом, вопрос, как может одна структура присоединительные строк в БД в каждом из чертежей. Вот структура файла:

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

здесь является 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 

Я пытался предложение ниже в ответах, но это не сработало. Посмотрите мои комментарии ниже этого предполагаемого ответа.

+0

Пожалуйста [править] для создания [mcve], в том числе * FUL l * traceback, а не только сообщение об ошибке. – davidism

+0

У вас есть 'mongo = PyMongo (app)' как в login.py, так и в child.py? –

+0

Не могли бы вы показать нам файловую структуру вашего проекта? – skyline75489

ответ

5

Одна из проблем с подходом к выполнению импорта в чертеже, как было предложено Эмануэлем Эй, оказывается, что он вызывает циклический импорт.После того, как много играть, то получается, что единственный способ (я мог бы найти) было создать отдельный файл с именем database.py, который подключается к базе данных, а затем я могу импортировать эту связь с помощью чертежа следующим образом:

child.py 

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

и мой database.py

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

и приложение, login.py но должен инициализировать базу данных

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

Возможно, вы захотите обобщить это еще раз, изменив database.py на settings.py и установив там различные элементы конфигурации. – ranman

2

Вы инициализируете драйвер PyMongo дважды, один раз в child.py и второй раз на child2.py.

Попробуйте инициализации соединения PyMongo в файле, который устанавливает свой объект приложения, а затем импортировать его в детях:

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) 

в child.py

from app import app, mongo 

child = Blueprint('child', __name__) 

child2.py:

from app import app, mongo 

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

Импорт невозможен, т. Е. При попытке «из приложения app app app, mongo», как и: «из приложения import mongo as mongo» со следующей проблемой: 'ImportError: не может импортировать имя 'mongo' ' – disruptive

+0

Также приложение, config до 'app = Flask (__name __)' – disruptive

Смежные вопросы