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'),
}
}
Кажется, что все, что я сделал, это:
- бросить мою базу данных
- уронить пользователя
- воссоздать пользователя
- пересоздать базу данных
- предоставить этому пользователю, сбросить привилегии
и тогда это начинает работать.
Также измените номер порта на "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'
}
}