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

Flask+PyMongo全局db对象返回None,访问prices集合报错

问题分析与解决方案

错误AttributeError: 'NoneType' object has no attribute 'prices'说明你通过LocalProxy获取的db对象是None,核心原因是PyMongo实例没有正确绑定到Flask应用,或者请求上下文未正确初始化。以下是具体排查和修复步骤:

1. 修正PyMongo的初始化方式(适配应用工厂模式)

你当前在get_db函数中每次请求都新建PyMongo实例,不符合Flask应用工厂的最佳实践,容易导致上下文绑定失败。应在应用工厂中初始化PyMongo并绑定到app实例:

修改create_app函数:

import os
from flask import Flask, render_template
from flask.json import JSONEncoder
from flask_cors import CORS
from flask_pymongo import PyMongo  # 导入PyMongo

from bson import json_util, ObjectId
from datetime import datetime, timedelta
from crypto.api.currencies import currencies_api_v1
from crypto.credentials.creds import DB_CONNECTION  # 导入连接字符串

def create_app():
    app = Flask(__name__)
    CORS(app)
    
    # 直接在工厂中配置MongoDB连接字符串,避免后续配置导致初始化延迟
    app.config['MONGO_URI'] = DB_CONNECTION
    
    # 初始化PyMongo并绑定到app实例
    app.mongo = PyMongo(app)
    
    app.register_blueprint(currencies_api_v1)

    @app.route('/', defaults={'path': ''})
    @app.route('/<path:path>')
    def serve(path):
        return render_template('index.html')

    return app

修改get_db函数:

from flask import g, current_app
from flask_pymongo import LocalProxy

def get_db():
    """Configuration method to return db instance"""
    db = getattr(g, "coin_markets", None)
    if db is None:
        # 从已绑定到app的mongo实例中获取数据库
        db = g.coin_markets = current_app.mongo.db
    return db

db = LocalProxy(get_db)

2. 确保在请求上下文内使用db对象

current_app和g都是Flask请求上下文的变量,不能在请求外部(比如应用启动时、非路由函数的全局代码中)直接调用db.prices,否则会因为上下文未激活导致db为None。所有数据库操作必须放在路由函数、视图函数或被这些函数调用的内部函数中。

3. 验证MongoDB连接字符串与权限

  • 确认连接字符串包含正确的数据库名称:比如mongodb+srv://<user>:<pass>@cluster0.mongodb.net/<your-db-name>?retryWrites=true&w=majority,<your-db-name>必须是你要访问的数据库名,否则PyMongo.db会指向默认数据库(可能不存在)。
  • 检查MongoDB Atlas的IP白名单:确保当前机器的IP已添加到Atlas的IP访问列表中。
  • 验证数据库用户权限:确认连接字符串中的用户拥有目标数据库的读写权限。

4. 简化run.py(可选)

因为已经在工厂中配置了MONGO_URI,run.py可以简化为:

from crypto.factory import create_app

if __name__ == "__main__":
    app = create_app()
    app.config['DEBUG'] = True
    app.run()

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 00:07:43