python - 如何将 PyMongo 与 Flask 蓝图一起使用?

标签 python mongodb flask pymongo

在蓝图中获取 mongo 对象的正确方法是什么?

这是我的父 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

我已经在答案中尝试了下面的建议,但这没有用。请参阅我在该预期答案下方的评论。

最佳答案

按照 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)

关于python - 如何将 PyMongo 与 Flask 蓝图一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33166612/

相关文章:

python - 打印语句之前执行的 Jupyter Notebook 输入行

java - 如何使用Mongo Java驱动@BsonCreator注解?

node.js - MongoDB - 如何使副本集真正无缝地降级

python - 如何从 Flask 制作 html 弹出窗口?

python - 将 json 字符串插入表中

python - 我可以有一本带有同名键的字典吗?

python - 无法使用 gunicorn 守护进程模式获取 Flask 的日志记录工作

python - 在 App Engine 上提供可执行文件会更改文件权限

java - Scala:java.lang.VerifyError - 函数参数不兼容 - 运行时错误

python - 将 HTML 属性值与 Flask 数据连接起来