使用flask_mysqldb开发认证服务时cursor报错:cursor不是None的已知成员
Flask-MySQLDB 认证服务 Cursor 错误修复方案
你的代码存在几个明确问题,直接导致了cursor相关错误,以下是修复要点和修正后的完整代码:
问题分析与修复
- 缺失os模块导入:代码中通过
os.environ.get读取环境变量,但未导入os模块,会触发NameError,需在开头添加import os。 - SQL执行参数格式错误:
cur.execute的参数传递方式错误,原代码将参数直接拼在SQL字符串里,正确做法是把参数作为第二个参数以元组形式传入,且单个元素的元组必须加逗号(避免被识别为普通括号)。 - 未处理查询结果与资源清理:执行查询后未获取结果,也未关闭cursor,可能引发资源泄漏问题。
修正后的完整代码
import os import jwt from flask import Flask, request from flask_mysqldb import MySQL server = Flask(__name__) mysql = MySQL(server) # 服务器配置 server.config["MYSQL_HOST"] = os.environ.get("MYSQL_HOST") server.config["MYSQL_USER"] = os.environ.get("MYSQL_USER") server.config["MYSQL_PASSWORD"] = os.environ.get("MYSQL_PASSWORD") server.config["MYSQL_DB"] = os.environ.get("MYSQL_DB") # MYSQL_PORT需为整数,环境变量读取的是字符串,需转换 server.config["MYSQL_PORT"] = int(os.environ.get("MYSQL_PORT")) if os.environ.get("MYSQL_PORT") else 3306 @server.route("/login", methods=["POST"]) def login(): auth = request.authorization if not auth: return "missing credentials", 401 # 查询数据库中的用户名和密码 cur = mysql.connection.cursor() try: # 正确传递参数的方式 res = cur.execute("SELECT email,password FROM user WHERE email=%s", (auth.username,)) if res > 0: user_data = cur.fetchone() email = user_data[0] password = user_data[1] # 此处可添加密码验证逻辑和JWT生成逻辑 return "Login successful", 200 else: return "Invalid credentials", 401 finally: # 确保cursor资源被释放 cur.close() if __name__ == "__main__": server.run(debug=True)
额外说明:
MYSQL_PORT从环境变量读取的是字符串,必须转换为整数,否则会引发数据库连接错误。- 添加
try...finally块确保cursor资源被正确释放。 - 补充了查询结果的处理逻辑,可在此基础上扩展密码校验、JWT签发等功能。
内容的提问来源于stack exchange,提问作者Madhusmitha Muduli
相关产品推荐
相关产品推荐

