wake-up-neo.com

Django: mysql: 1045, "Zugriff für Benutzer verweigert

Ich habe das gesamte Setup seit Monaten auf meinem lokalen Computer ausgeführt.
Ich installiere jetzt auf einem entfernten Standort.
Erstellt eine neue Mysql-Datenbank, erstellt einen neuen Benutzer ("someuser") und erteilt ihm vollständige Berechtigungen, wie

ERWÄHLE ALLE PRIVILEGES AUF. TO 'someuser' @ 'localhost' IDENTIFIED BY 'somepassword' MIT GRANT OPTION; 

Ich habe die Datenbank mit "python manage.py syncdb" synchronisiert und die korrekten Tabellen wurden erstellt. Meine Einstellungen.py hat denselben Benutzer.

Wenn ich jedoch versuche, einen Benutzer über die Anwendung anzumelden, und es auf die Datenbank trifft, sehe ich Folgendes in den Protokollen:

(1045, "Zugriff für Benutzer 'someuser' @ 'localhost' verweigert (mit Kennwort: YES)")

Ich habe mich über mysql angemeldet (auf derselben Box wie Django installiert) und die Berechtigungen geprüft und es zeigt korrekt an -

Zuschüsse für someuser @ localhost
ERWÄHLE ALLE PRIVILEGES AUF *. * TO 'someuser' @ 'localhost' IDENTIFIZIERT DURCH PASSWORT '* das gesalzenePasswortOverHere' WITH GRANT OPTION

Ich möchte nicht das root-Benutzer/Passwort für Django verwenden, da dies nicht der richtige Weg ist.

Irgendwelche Hinweise, was falsch sein könnte?

23
PlanetUnknown

Ich mache das so für eine Datenbank namens foo_db:

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

In meinem Fall hat die settings.py folgendes:

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

Und es funktioniert, wenn ich den 'USERNAME' in 'USER' ändere:

    DATABASES = {
    'default': {
        'ENGINE': 'Django.db.backends.mysql',
        'NAME': 'TRYDJANGO',
        'USER':'user_trydjango',
        'PASSWORD':'passtry',
        'PORT':'3306',
        'Host': 'localhost',
    }
}
6
Maritza Esparza

Meine Fehlermeldung zeigte an, dass kein Kennwort für die Datenbank angegeben wurde: 

Django.db.utils.OperationalError: (1045, "Zugriff verweigert für Benutzer 'mylocalusername' @ 'localhost' (unter Verwendung des Passworts: NO)")

Der manage.py sollte die Zugangsdaten für den Datenbankzugriff von settings.py abrufen. Hierbei handelt es sich um einen bestimmten Datenbankbenutzer (und natürlich auch das Kennwort dieses Benutzers). Es ist ein Sicherheitsfehler, auf meine Fehlermeldung zu reagieren, indem dem lokalen Benutzer Datenbankanmeldeberechtigungen erteilt werden.

In meinem Fall gab es Probleme mit dem settings.py (wir haben unsere Build-Pipeline von der Django-Pipeline zum Webpack umstrukturiert), und ich musste für den Fix Pipeline-relevante Teile aus meinem settings.py entfernen. Es ist eine Frage, warum ich keine Python-Fehlermeldung zu den settings.py-Problemen erhalten habe. Stattdessen habe ich diesen Fehler erhalten, der für das eigentliche Problem nicht lokal ist. Diese Fehlermeldung ist nur ein transitives Ergebnis des Quellproblems. Nachdem ich den manage.py korrigiert hatte, wurden die Anmeldeinformationen wie üblich aus den DATABASE-Einstellungen übernommen und alles lief reibungslos.


In unserem Fall haben wir Django-pipeline vor webpack verwendet (genauer gesagt pip Pakete Django-pipeline-browserify==0.4.1 und Django-pipeline==1.6.8), so dass ich nach dem Übergang diese Zeilen aus den Einstellungen entfernen musste:

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'

Bis dahin bekam ich nur unsinnige Fehlermeldungen.

1
Csaba Toth

@ mattblang:

In diesem Fall ist es hilfreich, wenn der Host auch in der tatsächlich verwendeten settings.py-Datei festgelegt ist.

Für mich ist /etc/graphite/local_settings.py dort, wo der DATABASES Stanzas einen falschen Wert hatte, für Host gab es: 'Host': '127.0.0.1',

Da während der Laufzeit des Befehls syncdb nach localhost gesucht wurde, habe ich ihn in 'Host': 'localhost', geändert.

Nun sieht es ungefähr so ​​aus:

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

... und jetzt wird der syncdb-Befehl python manage.py syncdb erfolgreich ausgeführt.

0
GeWi

Die Antwort von @duffymo und die letzte Aussage könnten für mich funktionieren.

create database foo_db;
create user foo_user identified by 'foo_password';
grant all on foo_db.* to [email protected] identified by 'foo_password' with grant option;
0
ReturnHttp402

Ich benutze diese config und es funktioniert.

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

Ich habe folgende Fehlermeldung erhalten: 

ModuleNotFoundError: Kein Modul mit dem Namen 'MySQLdb' Django.core.exceptions.ImproperlyConfigured: Fehler beim Laden des MySQLdb-Moduls. Haben Sie mysqlclient installiert?

Lösung # 01: Vergewissern Sie sich, dass Ihr Benutzer die Berechtigung hat, auf die Datenbank zuzugreifen und die DDL- und DML-Vorgänge darauf auszuführen.

Lösung # 02: Die Datenbankkonfiguration wurde in settings.py geändert

Von:

DATABASES = {

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

An:

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

Und es fing an zu arbeiten.

0

Es scheint, dass alles, was ich getan habe, ist:

  1. meine Datenbank löschen
  2. den Benutzer fallen lassen
  3. erstellen Sie den Benutzer neu
  4. erstellen Sie die Datenbank neu
  5. erteilen Sie diesem Benutzer Berechtigungen zum Flush

und dann fängt es an zu arbeiten.

0
Eric

soweit ich verstanden habe, ist ein Benutzer ein DB-Gastbenutzer und nicht der Administrator, richtig?

Erlauben Sie einem Benutzer von MySQL DB admin, einem Benutzer den Zugriff auf die MySQL-Umgebungstabelle 'mysql.user'.

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

Für mich hat es funktioniert, Ivan

0
Ivan Gruer

Ändern Sie auch die Portnummer in '3307', wenn MySQl-python 64-bit in settings.py ist. Dann passiert nur die Verbindung in Windows und MySql 5.7 Django. 

'3306' für MySQl-Python 32-Bit

DATABASES = {
    'default': {
        'NAME': 'graphite',
        'ENGINE': 'Django.db.backends.mysql',
        'USER': 'graphite',
        'PASSWORD': 'thepasswordyouchoose',
        'Host': 'localhost',
        'PORT': '3307'
    }
}
0
Vijay