注册校验时触发pymongo.ServerSelectionTimeoutError错误求助
解决方案
核心问题分析
错误的直接原因是代码配置了MongoDB Atlas远程集群的连接字符串,但实际初始化客户端时却指向了本地未启动的MongoDB服务,导致连接localhost:27017被拒绝。同时原代码的用户存在校验逻辑存在冗余,可优化。
具体修复步骤
1. 修正MongoDB客户端连接
删除本地连接的代码,改用你已配置的Atlas连接字符串创建客户端:
app = Flask(__name__,static_url_path='',static_folder="static") app.secret_key = 'just a string' app.config["MONGO_URI"] = "mongodb+srv://Beny1320001:Beny132001@cluster0.dn45iia.mongodb.net/?retryWrites=true&w=majority" # 替换原来的localhost连接,使用配置好的Atlas URI myclient = pymongo.MongoClient(app.config["MONGO_URI"]) user_db = myclient["authentication"] user_table = user_db["user_info"]
2. 优化用户存在校验逻辑
原代码通过for循环遍历查询结果的方式完全冗余,使用find_one可以直接判断用户是否存在,既简化代码又提升效率:
@app.route("/register_check", methods=['GET', 'POST']) def register_check(): if request.method == 'POST': req = dict(request.form) # 直接查询是否存在对应uid的用户 existing_user = user_table.find_one({'uid': req['uid']}) req_dict = {'uid': req['uid'], 'email': req['email'], 'password': req['password']} if not existing_user: user_table.insert_one(req_dict) return render_template('dashboard.html', uid=req['uid']) else: return render_template('invalid.html', message='User already exists') return render_template('register.html')
3. 额外验证项
- 登录MongoDB Atlas控制台,确认你的当前IP地址已添加到集群的IP白名单中(否则会被拒绝连接)
- 检查连接字符串中的用户名、密码、集群域名是否完全正确
内容的提问来源于stack exchange,提问作者Benjamin shtainberg
相关产品推荐
相关产品推荐

