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

Flask连接XAMPP MySQL遇1045权限拒绝错误求排查解决

问题分析与解决方案

错误信息MySQLdb.OperationalError: (1045, "Access denied for user 'root'@'localhost' (using password: NO)")核心是root用户以无密码方式连接localhost被拒绝,以下是针对性排查和解决步骤:

1. 确认XAMPP MySQL的root用户密码状态

  • 打开XAMPP控制面板,启动MySQL后点击「Shell」按钮
  • 输入命令mysql -u root:
    • 如果能成功进入MySQL命令行,说明root确实无密码,继续排查其他问题
    • 如果提示Access denied,说明你之前给root设置过密码,需要把代码中app.config["MYSQL_PASSWORD"] = ""改成对应的密码

2. 检查root用户的localhost权限

进入MySQL命令行后,执行以下查询:

SELECT user, host, authentication_string FROM mysql.user WHERE user='root';
  • 确保存在user='root'且host='localhost'的记录
  • 如果authentication_string不为空,说明该用户有密码,必须在Flask配置中填写对应密码
  • 若权限不足,执行授权命令(无密码情况):
GRANT ALL PRIVILEGES ON FlaskDeneme.* TO 'root'@'localhost' IDENTIFIED BY '';
FLUSH PRIVILEGES;

如果root有密码,把IDENTIFIED BY ''改成IDENTIFIED BY '你的密码'

3. 调整Flask连接配置

  • 尝试把app.config["MYSQL_HOST"] = "localhost"改成"127.0.0.1",部分XAMPP环境下MySQL默认监听127.0.0.1而非localhost
  • 确认app.config["MYSQL_DB"] = "FlaskDeneme"中的数据库名已在MySQL中创建,可通过SHOW DATABASES;命令验证

4. 修正代码结构问题

你的代码存在逻辑位置错误,表单初始化和POST处理必须放在路由函数内,否则会在应用启动时就执行,导致连接时机异常。正确示例:

from flask import Flask, render_template, request
from flask_wtf import Form
from wtforms import StringField, PasswordField, validators
from passlib.hash import sha256_crypt
from flask_mysqldb import MySQL

class KayitForm(Form):
    name = StringField("Ad Soyad",validators=[validators.Length(min = 3,max = 20)])
    username = StringField("Kullanıcı Adı",validators=[validators.Length(min = 5,max = 30)])
    email = StringField("E-posta",validators=[validators.DataRequired(message="E-posta Giriniz"),validators.Email(message="Hatalı E-Posta Girdiniz")])
    password = PasswordField("Parola:",validators=[
        validators.DataRequired(message="Parola Giriniz"),
        validators.EqualTo(fieldname = "confirm",message="Parolanız Uyumsuz")
    ])
    confirm = PasswordField("Parola Doğrula")

app = Flask(__name__)

app.config["MYSQL_HOST"] = "127.0.0.1"
app.config["MYSQL_USER"] = "root"
app.config["MYSQL_PASSWORD"] = "" # 替换为你的root密码(如果有)
app.config["MYSQL_DB"] = "FlaskDeneme"
app.config["MYSQL_CURSORCLASS"] = "DictCursor"

mys = MySQL(app)

@app.route("/register", methods=["GET", "POST"])
def register():
    form = KayitForm(request.form)
    if request.method == "POST" and form.validate():
        name = form.name.data
        username = form.username.data
        e_mail = form.email.data
        password = sha256_crypt.encrypt(form.password.data)
        cursor = mys.connection.cursor()

        sorgu = "insert into Users(name,email,username,password) values(%s,%s,%s,%s)"
        cursor.execute(sorgu,(name,e_mail,username,password))
        mys.connection.commit()
        cursor.close()
        return "Kayıt Başarılı!"
    return render_template("register.html", form=form)

if __name__ == "__main__":
    app.secret_key = "your_secret_key_here" # 必须设置secret_key用于表单CSRF保护
    app.run(debug=True)

内容的提问来源于stack exchange,提问作者Anonymuse

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 01:03:11