Django - MySQL:1045访问被拒绝'用户'@'localhost'

时间:2017-11-14 00:47:44

标签: mysql django python-3.x

我有一个使用MySQL数据库的Django应用程序。我创建了一个数据库foo,然后创建了一个新用户foo_user,授予foo.*foo_user的所有权限,以及刷新的权限。

我可以从命令行登录foo_userSHOW GRANTS;,这样就可以了:

+-----------------------------------------------------------+
| Grants for foo_user@localhost                             |
+-----------------------------------------------------------+
| GRANT USAGE ON *.* TO 'foo_user'@'localhost'              |
| GRANT ALL PRIVILEGES ON `foo`.* TO 'foo_user'@'localhost' |
+-----------------------------------------------------------+

我可以使用此代码段从Python连接:

import MySQLdb

try:
    db = MySQLdb.connect('localhost', 'foo_user', 'verysecurepassword', 'foo')
    cursor = db.cursor()
    cursor.execute('SHOW GRANTS;')
    results = cursor.fetchall()

    for r in results:
        print(r)
except MySQLdb.Error as e:
    print(e)

这将打印foo_user的特权。

settings.py

db_pass = ''
db_pass_file = os.path.join(os.path.expanduser('~'), 'db.passwd')
with open(db_pass_file, 'r') as dbpf:
    db_pass = dbpf.read()

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'foo',
        'USER': 'foo_user',
        'PASSWORD': db_pass,
        'HOST': 'localhost',
        'PORT': '3306',
    },
}

然而,当我尝试makemigrations时,我得到了

django.db.utils.OperationalError: (1045, "Access denied for user 'foo_user'@'localhost' (using password: YES)")

我遵循了我能找到的每个答案的建议。我删除了数据库和用户,然后重新创建了几次。我找不到任何明显错误的东西,错误本身并不是非常有用。我的问题是:如何从MySQL或Django中强制获取更多信息,以便我可以弄清楚出了什么问题?

ETA:python 3.5.2,Django 1.11.7,mysql Ver 14.14 Distrib 5.7.20,在EC2实例上运行

1 个答案:

答案 0 :(得分:0)

问题是从文件中读取密码末尾的额外换行符。

解决方案是改变

db_pass = dbpf.read()

db_pass = dbpf.read().rstrip()