使用Flask-Pymongo时db返回None,报'NoneType无stages属性'错误求助
问题根源
你遇到的NoneType does not have attribute 'stages'错误,核心原因是**db变量的赋值时机过早**:
当db.py被导入时(蓝图文件里导入了db),mongo.init_app(app)还没执行,此时mongo.db还未被初始化,所以db变量是None。
解决办法
方案1:修改db.py,延迟获取数据库实例
把直接赋值改成函数调用,确保在应用上下文存在时才获取数据库:
from temp.__init__ import mongo def get_db(): return mongo.db
然后在蓝图里调用这个函数:
from flask import Blueprint from temp.db import get_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(): db = get_db() # 在这里获取db stage = db.stages.find() print(stage) return "查询完成" # 必须添加返回值,否则会触发500错误
方案2:调整导入顺序,确保Mongo初始化后再导入蓝图
修改__init__.py,把蓝图导入和注册放在mongo.init_app(app)之后,移除不必要的上下文包裹:
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) # 先完成Mongo初始化,再导入并注册蓝图 from temp.routes.stage_routes import stage_route app.register_blueprint(stage_route) return app
此时db.py可以保留原写法,因为蓝图是在Mongo初始化后才导入的,db = mongo.db会在正确的时机完成赋值:
from temp.__init__ import mongo db = mongo.db
同样要给all函数添加返回值,避免Flask内部错误。
额外注意点
- 确认
config.py里的MONGO_URI格式正确:mongodb://username:password@host:port/db_name,末尾的db_name必须是你实际存在的数据库名称 - 检查MongoDB服务是否正常运行,应用服务器有权限访问目标数据库
内容的提问来源于stack exchange,提问作者Derithus
相关产品推荐
相关产品推荐

