使用Flask+Flask-PyMongo开发登录接口调用时报500错误如何解决
问题根源
你怀疑的hashed = user.password这行确实是核心问题:
- Flask-PyMongo的
find_one()返回的是Python字典,不是自定义类对象,不能用.属性访问的方式取值,必须用字典的键索引写法user['password'] - 这行代码执行时会抛出
AttributeError,异常没有被捕获,导致视图函数中途终止,没有返回任何响应,才触发了你看到的did not return a valid response报错。
修复方案
1. 修正密码字段取值写法
把hashed = user.password改成hashed = user['password']
2. 可选:增加异常捕获逻辑(提升鲁棒性)
避免其他意外情况导致无返回的问题,可以给核心逻辑加异常捕获,兜底返回错误响应。
修复后完整代码参考
def login(): try: email = request.form['email'] password = request.form['password'] # Find user record by email user = db.user.find_one({'email': email}) # If user not found return message if not user: return jsonify(message='We cannot find you, please sign up'), 404 # 修正字典取值写法 hashed = user['password'] test = pbkdf2_sha256.verify(password, hashed) # Returns on success if test: access_token = create_access_token(identity=email) return jsonify(message='Login Successful', access_token=access_token), 202 else: return jsonify(message='Password incorrect'), 403 except Exception as e: # 开发阶段可以打印错误排查,生产环境可以记录日志 print(f"登录接口错误:{str(e)}") return jsonify(message='Server internal error'), 500
额外优化提示
原来的用户不存在分支没有指定状态码,默认会返回200,不符合HTTP语义,上面的修复代码里加了404状态码,你可以根据自己的业务需求调整。
内容的提问来源于stack exchange,提问作者Graham Morby
相关产品推荐
相关产品推荐

