如何将 PyMongo 与 Flask 蓝图一起使用?
How to use PyMongo with Flask Blueprints?
在蓝图中选择 mongo object 的正确方法是什么?
这是我的 parent 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
与 child:
结构相同
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
但这会引发错误。这是完整的回溯:
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)xxx@linux:~/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:xxxx@xxxx.mongolab.com:55822/heroku_xxx";
MONGO_URI = MONGO_URL
我已经在答案中尝试了下面的建议,但这没有用。请参阅我在该预期答案下方的评论。
您正在初始化 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__)
按照 Emanuel Ey 的建议,在蓝图中执行导入的方法的一个问题是它会导致循环导入。玩了很多之后,事实证明(我能找到的)唯一方法是创建一个名为 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)
在蓝图中选择 mongo object 的正确方法是什么?
这是我的 parent 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
与 child:
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
但这会引发错误。这是完整的回溯:
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)xxx@linux:~/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:xxxx@xxxx.mongolab.com:55822/heroku_xxx";
MONGO_URI = MONGO_URL
我已经在答案中尝试了下面的建议,但这没有用。请参阅我在该预期答案下方的评论。
您正在初始化 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__)
按照 Emanuel Ey 的建议,在蓝图中执行导入的方法的一个问题是它会导致循环导入。玩了很多之后,事实证明(我能找到的)唯一方法是创建一个名为 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)