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

Posted

技术标签:

【中文标题】如何将 PyMongo 与 Flask 蓝图一起使用?【英文标题】:How to use PyMongo with Flask Blueprints? 【发布时间】:2016-01-14 23:28:49 【问题描述】:

在蓝图中拾取 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

我已在答案中尝试了以下建议,但这不起作用。请在该预期答案下方查看我的 cmets。

【问题讨论】:

你在 login.py 和 child.py 中都有mongo = PyMongo(app) 吗? 你能告诉我们你的项目的文件结构吗? 【参考方案1】:

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)

【讨论】:

您可能希望通过将 database.py 更改为 settings.py 并在那里设置各种配置项来进一步概括这一点。【参考方案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__)

【讨论】:

导入失败,即在尝试from app import app, mongo 时,同样如此:from app import mongo as mongo,出现以下问题:ImportError: cannot import name 'mongo' 另外app,config在app = Flask (__name__)之前

以上是关于如何将 PyMongo 与 Flask 蓝图一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

第八篇 Flask中的蓝图

Flask--蓝图

python 有关如何将Flask与requests-oauthlib一起使用以使用OAuth 2令牌获取GitHub用户配置文件的示例。

python 有关如何将Flask与requests-oauthlib一起使用以使用OAuth 2令牌获取GitHub用户配置文件的示例。

flask蓝图与插件

Flask插件与蓝图