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
相关产品推荐
相关产品推荐

