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

Flask中PyMongo查询MongoDB文档报UnboundLocalError解决方法

问题根因
  • 缩进语法错误:user_profile路由函数下的数据库连接、查询代码没有做函数级缩进,路由触发时这部分代码不会按预期执行
  • 变量未定义风险:用for x in col.find(...)遍历查询游标时,如果没有匹配到任何文档,循环体不会执行,x变量从未被赋值,最后执行return x就会触发UnboundLocalError
  • 路由参数匹配错误:定义的路由规则是/user/<string:phone>,正确传参路径是/user/手机号内容,访问时加phone=前缀,会导致传入的参数值变成phone=9331828671,和数据库中存储的纯手机号格式不匹配,查不到结果
  • 连接资源浪费:把MongoDB客户端初始化写在路由函数内,每次请求都会新建一个数据库连接,服务长时间运行会耗尽连接池资源
  • 无用依赖导入:代码导入了flask_pymongo但全程没有调用,属于冗余代码
  • 返回值不规范:直接遍历游标返回x只能拿到多结果中的最后一条,且没有做JSON序列化处理,可能出现响应格式错误
修复后完整代码
from flask import Flask, jsonify
import pymongo

app = Flask(__name__)

# 全局初始化数据库连接,避免每次请求新建连接占用资源
client = pymongo.MongoClient("mongodb+srv://Diligent:Diligent1234@cluster0.1pnpt.mongodb.net/test")
db = client["MyDatabase"]
user_col = db["UserID"]

@app.route("/")
def home_page():
    return "hello world" 

@app.route("/user/<string:phone>")
def user_profile(phone):
    # 手机号为唯一标识,直接用find_one查询单条文档,无需遍历游标
    user_data = user_col.find_one(
        {"Contact No": phone}, 
        {"_id":0, "UserID": 1, "User": 1, "Contact No": 1, "Designation": 1 }
    )
    # 处理查询不到数据的场景,避免变量未定义报错
    if not user_data:
        return jsonify({"code": 404, "msg": "未找到对应用户信息"}), 404
    # 返回标准JSON格式响应
    return jsonify(user_data)

if __name__ == "__main__":
    app.run(debug=True)
使用说明
  • 启动服务后,访问路径不要带phone=前缀,正确格式为http://127.0.0.1:5000/user/9331828671
  • 匹配到用户时直接返回JSON格式的用户字段信息,匹配不到时返回404状态和提示,不会再出现变量未定义的报错
  • 如果需要查询同个手机号下绑定的多个用户,可以把find_one改回find,将结果转成列表后再返回,参考写法:user_list = list(user_col.find(查询条件, 返回字段规则)),判断列表为空时返回404,否则返回列表即可

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.28 03:48:09