Flask-Pymongo DB 返回为 None

问题描述 投票:0回答:2

我正在尝试使用

Flask-Pymongo
创建一个网络应用程序,但它说我的数据库不存在。

这是我的

__init__.py
:

import os
from flask import Flask
from flask_pymongo import PyMongo

mongo = PyMongo()

def init_app():

    app = Flask(__name__)
    app.config.from_pyfile('config.py')
    mongo.init_app(app)
    
    with app.app_context():
        from temp.routes.stage_routes import stage_route
        app.register_blueprint(stage_route)
    
    return app

这是我的db.py(temp是顶级目录)

from temp.__init__ import mongo

db = mongo.db

这是我的蓝图之一,其中包含查询数据库的路线

from flask import Blueprint

from temp.db import db

stage_route = Blueprint('stage_route', __name__, url_prefix='/stages')

@stage_route.route('/')
def home():
    return 'This is the home page for the stage blueprint'

@stage_route.route('/all')
def all():
    stage = db.stages.find() # This is where the error is
    print(stage)

出于某种原因,我收到错误消息“NoneType 没有属性‘stages’”,因为它表示 db 变量为 none。我不明白为什么会发生这种情况,因为数据库和集合确实存在,并且 MONGO_URI 字符串是从配置文件加载的。我可以看到它正在 mongodb 端连接,但我假设它与 init.py 文件中的 create_app() 函数有关。你看到我缺少的东西了吗?任何帮助将不胜感激

python mongodb flask pymongo flask-pymongo
2个回答
0
投票

代码缺少连接 URI 字符串,如文档中所述 -

from flask import Flask
from flask_pymongo import PyMongo

app = Flask(__name__)

# The missing URI
app.config["MONGO_URI"] = "mongodb://localhost:27017/myDatabase"

mongo = PyMongo(app)

0
投票

我认为问题是你正在连接到集群,而集群有很多数据库,所以你需要指定你要连接到哪个数据库。 我遇到了同样的问题,这就是我解决它的方法 修复它的第一种方法是在集群名称后面指定数据库的名称,如下所示。

MONGO_URI="mongodb+srv://<username>:<password>@<cluster-name>/<databasename>?retryWrites=true&w=majority"

使用第一种方式,您可以直接访问 mongo 对象的“db”属性。 就像下面的例子

from flask import Blueprint
from .extensions import mongo
from pymongo.database import Database

main: Blueprint = Blueprint("main", __name__)


@main.route("/")
def home():
    
    mongo.db.books.insert_one({"name": "Meditations by Me"})

    return "book inserted !"

第二种方法是使用 MongoClient 以经典的 pymongo 方式访问数据库,这与 mongo 对象下的 cx 属性相同,如下所示,在我的示例中,我的数据库的名称是library

from flask import Blueprint
from .extensions import mongo
from pymongo.database import Database

main: Blueprint = Blueprint("main", __name__)


@main.route("/")
def home():
    
    mongo.cx.library.books.insert_one({"name": "Meditations by Me"})

    return "book inserted !"

library之类的数据库可以像MongoClient对象中的属性一样直接访问,与Databases下的集合相同。

我使用 Flask-pymongo 和 PyMongo 文档页面作为参考: https://pymongo.readthedocs.io/en/stable/tutorial.html https://flask-pymongo.readthedocs.io/en/latest/#flask_pymongo.PyMongo

© www.soinside.com 2019 - 2024. All rights reserved.