Django: mysql: 1045, "Доступ запрещен для пользователя - PullRequest
23 голосов
/ 14 марта 2010

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

ПРЕДОСТАВЛЯЙТЕ ВСЕ ПРИВИЛЕГИИ НА . TO 'someuser' @ 'localhost', ОПРЕДЕЛЯЕМЫМ 'somepassword' С ПОМОЩЬЮ GRANT OPTION;

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

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

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

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

Гранты для пользователя @ localhost
ПРЕДОСТАВЛЯЙТЕ ВСЕ ПРИВИЛЕГИИ НА *. * 'Someuser' @ 'localhost', ИДЕНТИФИЦИРОВАННЫЙ ПАРОЛЕМ '* thesaltedpasswordOverHere' С ГРАНТОМ ВАРИАНТОМ

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

Есть какие-нибудь указатели на то, что может быть не так?

Ответы [ 10 ]

26 голосов
/ 14 марта 2010

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

create database foo_db;
create user foo_user identified by 'foo_password';
grant all on foo_db.* to 'foo_user'@'%';
flush privileges;
7 голосов
/ 30 ноября 2015

В моем случае 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',
    }
}
1 голос
/ 10 октября 2018

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

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'

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

0 голосов
/ 08 октября 2018

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

ModuleNotFoundError: нет модуля с именем «MySQLdb» django.core.exceptions.ImproperlyConfigured: Ошибка загрузки MySQLdb модуль. Вы установили mysqlclient?

Решение № 01: Убедитесь, что у вашего пользователя есть разрешение на доступ к базе данных и выполнение операций с DDL и DML.

Решение № 02: Изменена конфигурация базы данных в settings.py file

Из:

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 голосов
/ 22 февраля 2018

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

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

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

0 голосов
/ 27 ноября 2017

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

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': '/etc/my.cnf',
        },
        #'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}
0 голосов
/ 09 октября 2017

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

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

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

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

0 голосов
/ 08 мая 2017

Ссылка на ответ @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 голосов
/ 02 марта 2017

Также измените номер порта на «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'
    }
}
0 голосов
/ 24 сентября 2015

@ 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 успешно выполняется.

...