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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 10:15:14