【问题标题】:Django : mysql : 1045, "Access denied for userDjango:mysql:1045,“用户访问被拒绝
【发布时间】:2011-01-27 10:57:25
【问题描述】:

整个设置在我的本地计算机上运行了几个月。
我现在正在远程站点上安装。
创建了一个新的 mysql 数据库,并创建了一个新用户(“someuser”)并为其提供了完整的授权,就像这样 -

将所有权限授予 . 到 'someuser'@'localhost' 由 'somepassword' 使用 GRANT 选项识别;

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

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

(1045,“用户'someuser'@'localhost'的访问被拒绝(使用密码:YES)”)

我通过 mysql(与 django 安装在同一个盒子上)登录并检查了授权,它正确显示 -

为 someuser@localhost 授予的资助
授予 * 上的所有特权。 * TO 'someuser'@'localhost' IDENTIFIED by PASSWORD '*thesaltedpasswordOverHere' WITH GRANT OPTION

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

关于可能出现什么问题的任何指针?

【问题讨论】:

  • 你还记得你是否成功了吗?

标签: mysql django mysql-error-1045


【解决方案1】:

我对名为 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 相同的事情。我按照你的方法,但我仍然得到同样的错误。
  • grant all 非常广泛,可能会施加安全线程。它可能工作,但不安全且有风险。也许考虑切换到更独特的特权?
  • 这里我已授予对localhost 的访问权限,但在我的DATABASE_URL 中写入的IP 地址127.0.0.1相同(安全性)。
【解决方案2】:

在我的情况下,settings.py 有以下内容:

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

如果我将“用户名”更改为“用户”,它会起作用:

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

【讨论】:

    【解决方案3】:

    据我了解 someuser 是 DB 来宾用户,而不是管理员用户,对吧?

    如果是这样,请从您的 MySQL DB 管理员用户那里,授予 someuser 访问 MySQL 环境表 'mysql.user' 的权限,如下所示:

    mysql.user 上授予选择到'someuser'@'%';

    对我来说它有效, 伊万

    【讨论】:

      【解决方案4】:

      参考@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;
      

      【讨论】:

        【解决方案5】:

        我的错误信息表明没有向数据库提供密码:

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

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

        在我的情况下,settings.py 存在问题(我们正在将构建管道从 django 管道重组为 webpack),我需要从 settings.py 中删除管道相关部分以进行修复。这是一个问题,为什么我没有收到关于 settings.py 问题的任何 python 错误消息,而是我收到了这个错误,这不是真正问题的本地错误。该错误消息只是源问题的传递结果。一旦我修复了manage.py,就照常从数据库设置中获取凭据,一切都很顺利。


        在我们的例子中,我们在 webpack 之前使用 django-pipeline(更具体地说是 pipdjango-pipeline-browserify==0.4.1django-pipeline==1.6.8),所以一旦我们过渡,我必须从设置中删除这些行:

        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 我添加了详细信息
        【解决方案6】:

        @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 运行成功。

        【讨论】:

          【解决方案7】:

          如果 MySQl-python 64-bit 在 settings.py 中也将端口号更改为“3307”,那么只有在 Windows 和 MySql 5.7 django 中发生连接。

          '3306' 用于 MySQl-python 32 位

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

          【讨论】:

            【解决方案8】:

            看来我所做的只是:

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

            然后它开始工作。

            【讨论】:

            • 感谢您抽出宝贵时间提供答案。正是因为像您这样乐于助人的同龄人,我们才能作为一个社区一起学习。以下是一些关于如何使您的答案出色的提示:How do I write a good answer
            【解决方案9】:

            我使用这个配置并且它有效。

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

            【讨论】:

              【解决方案10】:

              我收到以下错误:

              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',
                  }
              }
              

              而且它开始工作了。

              【讨论】:

                【解决方案11】:

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

                【讨论】:

                  猜你喜欢
                  • 2016-08-08
                  • 1970-01-01
                  • 2015-06-15
                  • 2014-09-22
                  • 2014-04-11
                  • 2016-04-25
                  • 2020-10-10
                  • 2016-07-11
                  • 2015-06-03
                  相关资源
                  最近更新 更多