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
相关产品推荐
相关产品推荐

