Django: MySQL: 1045,“用户访问被拒绝”

29
我已经在本地电脑上使整个设置运作了几个月。
现在我正在远程站点进行安装。
创建了一个新的mysql数据库,并创建了一个新用户(“someuser”),并授予完全的权限,如下所示 -

  

GRANT ALL PRIVILEGES ON . TO 'someuser'@'localhost' IDENTIFIED BY 'somepassword' WITH GRANT OPTION;

我使用“python manage.py syncdb”同步了数据库,并正确创建了表。 我的settings.py中有相同的用户。

但是当我尝试通过应用程序登录用户并访问DB时,在日志中看到以下内容 -

  

(1045,“Access denied for user'someuser'@'localhost'(using password:YES)”)

我通过mysql登录(安装在与django相同的框中)并检查了授权,它正确显示 -

  

Grants for someuser@localhost
  GRANT ALL PRIVILEGES ON *。* TO 'someuser'@'localhost' IDENTIFIED BY PASSWORD'*thesaltedpasswordOverHere'WITH GRANT OPTION

我不想为django使用root用户/密码,因为这似乎不是正确的方法。

任何指针可能出了什么问题?


你还记得你是否让这个工作起来了吗? - theblang
12个回答

36

我使用以下方式处理名为foo_db的数据库:

create database foo_db;
create user foo_user identified by 'foo_password';
grant all on foo_db.* to 'foo_user'@'%';
flush privileges;

谢谢,那很有帮助!我想原因可能是我先创建了用户再创建数据库。这很奇怪,因为当你查看授权信息时,它会显示你对*.*具有访问权限,这是误导人的。它应该适用于在那之后创建的任何实例。 - PlanetUnknown
我其实正试着做和PlanetUnknown一样的事情。我按照你的方法操作,但仍然得到相同的错误。 - theblang
“grant all”非常宽泛,可能会带来安全威胁。虽然它可能能够工作,但不安全且存在风险。也许考虑切换到更明确的权限? - Roland
在这里,我已经授予了对 localhost 的访问权限,但是在我的 DATABASE_URL 中写的是 IP 地址 127.0.0.1,这是不同的(安全性)。 - Roland

11

在我的情况下,settings.py 文件如下:

    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'TRYDJANGO',
        'USERNAME':'user_trydjango',
        'PASSWORD':'passtry',
        'PORT':'3306',
        'HOST': 'localhost',
    }
}

如果我把“USERNAME”改成“USER”,它就可以工作:

    DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'TRYDJANGO',
        'USER':'user_trydjango',
        'PASSWORD':'passtry',
        'PORT':'3306',
        'HOST': 'localhost',
    }
}

2

据我所理解,someuser 是数据库的访客用户而不是管理员用户,对吗?

如果是这样的话,从您的MySQL数据库管理员用户中,按照以下方式授予someuser访问MySQL环境表'mysql.user'的权限:

GRANT SELECT ON mysql.user TO 'someuser'@'%';

对我来说这很有效, Ivan


1

我的错误信息显示数据库没有提供密码:

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

manage.py 应该从 settings.py 中获取数据库访问凭据,这是一个特定的数据库用户(当然也包括该用户的密码)。通过授予本地用户数据库登录权限来应对我的错误信息是一个安全错误。

在我的情况下,settings.py 存在问题(我们正在将构建流程从 Django Pipeline 转移到 Webpack),我需要从我的 settings.py 中删除与 pipeline 相关的部分以进行修复。我不知道为什么没有收到有关 settings.py 问题的 Python 错误消息,而是得到了这个与真正问题无关的错误。那个错误消息只是源问题的中间结果。一旦我修复了 manage.py,凭据就像往常一样从 DATABASE 设置中获取,并且一切顺利。


在我们的情况下,在使用webpack之前,我们使用的是django-pipeline(更具体地说,是pipdjango-pipeline-browserify==0.4.1django-pipeline==1.6.8),因此一旦我们过渡到了webpack,我只需要从设置中删除这些行即可。
NODE_MODULES_BIN = '/home/myuser/sourcerepositorydir/node_modules/.bin/'
PIPELINE['SASS_BINARY'] = '/var/lib/gems/2.3.0/gems/sass-3.5.3/bin/sass'
PIPELINE['BABEL_BINARY'] = '{}{}'.format(NODE_MODULES_BIN, 'babel')
PIPELINE['BROWSERIFY_BINARY'] = '{}{}'.format(NODE_MODULES_BIN, 'browserify')
PIPELINE_BROWSERIFY_BINARY = PIPELINE['BROWSERIFY_BINARY']
PIPELINE['BROWSERIFY_ENV'] = {'NODE_ENV': 'development'}
PIPELINE['BROWSERIFY_ARGUMENTS'] = PIPELINE['BROWSERIFY_ARGUMENTS'] + ' --debug'

直到那时我才开始收到毫无意义的错误信息。

请告诉我们在settings.py中进行了哪些确切的更改以使其正常工作。我们遇到了相同的问题。 - Shiva
@Shiva 我添加了细节。 - Csaba Toth

1

参考@duffymo的答案并更改最后一句话对我有帮助。

create database foo_db;
create user foo_user identified by 'foo_password';
grant all on foo_db.* to foo_user@localhost identified by 'foo_password' with grant option;

0

我使用这个配置,它可以正常工作。

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': '/etc/my.cnf',
        },
        #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}

0

我遇到了以下错误:

ModuleNotFoundError: 找不到名为'MySQLdb'的模块 django.core.exceptions.ImproperlyConfigured: 加载MySQLdb模块时出错。您是否安装了mysqlclient?

解决方案 #01: 验证用户是否有权限访问数据库并执行DDL和DML操作。

解决方案 #02:settings.py文件中更改数据库配置。

来自:

DATABASES = {

'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'root'
    }
}

收件人:

DATABASES = {

'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'db_name',
        'USER': 'root',
        'PASSWORD': 'root',
        'HOST': 'localhost',   # Or an IP Address that your DB is hosted on
        'PORT': '3306',
    }
}

然后它开始工作了。


0

@ mattblang:

在这种情况下,如果主机也在实际使用的settings.py文件中设置,则会有所帮助。

对我来说,它是/etc/graphite/local_settings.py,其中DATABASES Stanzas的值错误,对于HOST,它是: 'HOST':'127.0.0.1',

因为在syncdb命令的运行期间它搜索localhost,所以我将其更改为 'HOST':'localhost',

现在它看起来像这样:

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

...现在syncdb命令python manage.py syncdb成功运行。


0

我在cpanel/mysql中解决了我的问题,添加了用户到数据库,希望能对你有所帮助。


0

看起来我所做的只有:

  1. 删除我的数据库
  2. 删除用户
  3. 重新创建用户
  4. 重新创建数据库
  5. 授予该用户权限,刷新权限

然后它开始工作了。


感谢您抽出时间来贡献答案。正是因为像您这样乐于助人的同行,我们才能作为一个社区一起学习。以下是一些关于如何撰写出色答案的提示:如何撰写出色答案 - Brien Foss

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接