You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flask集成PyMongo报错:'NoneType' object has no attribute 'todos'

报错原因

报错的核心是代码执行顺序问题,配合Flask-PyMongo的初始化逻辑触发:

  1. 你使用了Flask应用工厂模式,extensions.py里初始化的mongo是未绑定应用的空实例,只有执行mongo.init_app(app)之后,mongo.db才会指向配置好的数据库连接,在这之前mongo.db的值为None。
  2. 你在__init__.py的顶层、create_app()函数外部就写了from .main.routes import main,导入模块时会立刻执行routes.py里的所有顶层代码,也就是todos_collection = mongo.db.todos这行的执行时机,早于mongo.init_app(app),此时访问None.todos就会抛出AttributeError。
  3. 额外配置问题:你提到目标数据库名为mydb,但配置的MONGO_URI末尾路径为todos,即便初始化顺序正确,也会默认连接到todos库,和预期不符。
修复步骤
  • 调整__init__.py的导入顺序,把蓝图导入逻辑挪到mongo.init_app(app)之后执行,同时修正MONGO_URI里的数据库名为你实际使用的mydb,修正后代码如下:
from flask import Flask
from .extensions import mongo

def create_app():
    app = Flask(__name__)
    # 替换<password>为实际的数据库密码,末尾路径改为目标库名mydb
    app.config['MONGO_URI'] = 'mongodb+srv://admin:<password>@cluster0.r324nzc.mongodb.net/mydb'
    mongo.init_app(app)

    # mongo初始化完成后再导入路由蓝图,避免提前执行路由模块代码
    from .main.routes import main
    app.register_blueprint(main)

    return app
  • 修改routes.py,移除顶层的todos_collection赋值,把集合获取逻辑放到路由函数内部,保证调用时mongo已经完成初始化,修正后代码如下:
from flask import Blueprint, render_template, redirect, url_for, request
from ..extensions import mongo
main = Blueprint('main', __name__)

@main.route('/')
def index():
    return render_template('index.html')

@main.route('/add_todo', methods=['POST'])
def add_todo():
    # 路由触发时应用已完成初始化,可正常获取集合对象
    todos_collection = mongo.db.todos
    todo_item = request.form.get('add-todo')
    todos_collection.insert_one({'text' : todo_item, 'complete' : False})
    return redirect(url_for('main.index'))
  • extensions.py无需修改,保持原有代码即可:
from flask_pymongo import PyMongo

mongo = PyMongo()

内容的提问来源于stack exchange,提问作者Hansika Sachdeva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 15:15:33