Django: mysql: 1045, "Доступ запрещен для пользователя

У меня целая установка работает в течение нескольких месяцев на моем локальном компьютере.
Я сейчас устанавливаю на удаленный сайт.
Создал новую базу данных mysql, создал нового пользователя ("someuser") и дал ему полные права, например:

ПРЕДОСТАВЛЯЙТЕ ВСЕ ПРИВИЛЕГИИ . TO 'someuser' @ 'localhost' ИДЕНТИФИЦИРОВАНО 'somepassword' С ДЕЙСТВИЕМ GRANT;

Я синхронизировал БД, используя "python manage.py syncdb", и были созданы правильные таблицы. Мой settings.py имеет этого же пользователя.

Но когда я пытаюсь войти в систему через приложение, и оно попадает в БД, я вижу в журналах следующее:

(1045, "Доступ запрещен для пользователя" someuser "@" localhost "(с использованием пароля: ДА)")

Я вошел в систему через mysql (установленный на той же коробке, что и django) и проверил гранты, и это правильно показывает -

Гранты для someuser@localhost
ПРЕДОСТАВЛЯЙТЕ ВСЕ ПРИВИЛЕГИИ НА * . * 'Someuser' @ 'localhost', ОПРЕДЕЛЯЕМЫЙ ПО ПАРОЛЮ '* thesaltedpasswordOverHere' С ГРАНТОВЫМ ВАРИАНТОМ

Я не хочу использовать пользователя root / пароль для django, так как это не совсем правильно.

Любые указатели относительно того, что может быть не так?

12 ответов

Решение

Я делаю это так для базы данных с именем foo_db:

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

В моем случае 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',
    }
}

Насколько я понял someuser является гостем БД, а не администратором, верно?

Если это так, от вашего администратора MySQL DB предоставьте someuser доступ к таблице среды MySQL "mysql.user" следующим образом:

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

Для меня это сработало, Иван

Ссылка на ответ @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;

В моем сообщении об ошибке указывалось, что в базу данных не был введен пароль:

django.db.utils.OperationalError: (1045, "Доступ запрещен для пользователя" mylocalusername "@" localhost "(с использованием пароля: НЕТ)")

manage.py следует забрать учетные данные для доступа к базе данных из settings.pyэто конкретный пользователь базы данных (и, конечно, пароль этого пользователя). Это ошибка безопасности - реагировать на мое сообщение об ошибке, предоставляя права доступа к базе данных локальному пользователю.

В моем случае были проблемы с settings.py (мы реструктурировали наш конвейер сборки из конвейера django в webpack), и мне нужно было удалить части, связанные с конвейером, из моего settings.py для исправления. Это вопрос, почему я не получил сообщение об ошибке Python о settings.py проблемы, но вместо этого я получил эту ошибку, которая не является локальной для реальной проблемы. Это сообщение об ошибке является лишь переходным результатом исходной проблемы. Однажды я исправил manage.pyучетные данные были выбраны в настройках базы данных как обычно, и все прошло гладко.


В нашем случае мы использовали django-pipeline перед веб-пакетом (более конкретно pip пакеты django-pipeline-browserify==0.4.1 а такжеdjango-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'

До этого я просто получал бессмысленные сообщения об ошибках.

Я столкнулся с этой проблемой при попытке подключиться к удаленной БД после ее миграции с локального хоста. Мне удалось устранить эту проблему, удалив все предыдущие миграции, а затем запустив

      python manage.py makemigrations

после этого,

      python manage.py migrate

решил мою проблему, поэтому надеюсь, что это поможет.

Я получил следующую ошибку:

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

И это начало работать.

Я решаю свою проблему в cpanel/mysql, добавляю пользователя в базу данных, надеюсь, это поможет

@ 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 работает успешно.

Я использую этот конфиг, и он работает.

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

Кажется, что все, что я сделал, это:

  1. бросить мою базу данных
  2. уронить пользователя
  3. воссоздать пользователя
  4. пересоздать базу данных
  5. предоставить этому пользователю, сбросить привилегии

и тогда это начинает работать.

Также измените номер порта на "3307", если MySQl-python 64-bit в settings.py, тогда только соединение происходит в Windows и MySql 5.7 django.

'3306' для 32-битного MySQl-python

DATABASES = {
    'default': {
        'NAME': 'graphite',
        'ENGINE': 'django.db.backends.mysql',
        'USER': 'graphite',
        'PASSWORD': 'thepasswordyouchoose',
        'HOST': 'localhost',
        'PORT': '3307'
    }
}
Другие вопросы по тегам