operationalerror - Django: mysql: 1045, "Acceso denegado para el usuario
django db utils operationalerror 1045 access denied for user (10)
Tengo toda la configuración funcionando durante meses en mi computadora local.
Estoy instalando en un sitio remoto ahora.
Creó una base de datos mysql nueva, y creó un nuevo usuario ("someuser") y le otorgó subvenciones completas, como así:
OTORGAR TODOS LOS PRIVILEGIOS EN . A ''someuser'' @ ''localhost'' IDENTIFICADO POR ''somepassword'' CON OPCIÓN DE SUBVENCIÓN;
He sincronizado la base de datos, usando "python manage.py syncdb" y se crearon las tablas correctas. Mi settings.py tiene este mismo usuario.
Pero cuando intento iniciar sesión en un usuario a través de la aplicación y ésta llega a la base de datos, veo lo siguiente en los registros:
(1045, "Acceso denegado para el usuario ''someuser'' @ ''localhost'' (usando contraseña: SI)")
Ingresé a través de mysql (instalado en la misma casilla que django) y verifiqué las concesiones y muestra correctamente
Becas para someuser @ localhost
OTORGAR TODOS LOS PRIVILEGIOS EN *. * A ''someuser'' @ ''localhost'' IDENTIFICADO POR CONTRASEÑA ''* thesaltedpasswordOverHere'' CON OPCIÓN DE SUBVENCIÓN
No quiero usar el usuario / contraseña de root para django, ya que no parece la forma correcta.
¿Algún indicador sobre lo que podría estar mal?
@ Mattblang:
En este caso, es útil si el host también está configurado en el archivo settings.py
utilizado en realidad.
Para mí es /etc/graphite/local_settings.py
donde las DATABASES Stanzas
tenían un valor incorrecto, para HOST había: ''HOST'': ''127.0.0.1'',
Porque durante el tiempo de ejecución del comando syncdb que buscó localhost, lo cambié a ''HOST'': ''localhost'',
Ahora se ve algo como esto:
DATABASES = {
''default'': {
''NAME'': ''graphite'',
''ENGINE'': ''django.db.backends.mysql'',
''USER'': ''graphite'',
''PASSWORD'': ''thepasswordyouchoose'',
''HOST'': ''localhost'',
''PORT'': ''3306''
}
}
... y ahora el comando python manage.py syncdb
ejecuta correctamente.
En mi caso el settings.py tiene lo siguiente:
DATABASES = {
''default'': {
''ENGINE'': ''django.db.backends.mysql'',
''NAME'': ''TRYDJANGO'',
''USERNAME'':''user_trydjango'',
''PASSWORD'':''passtry'',
''PORT'':''3306'',
''HOST'': ''localhost'',
}
}
Y funciona si cambio el "NOMBRE DE USUARIO" a "USUARIO":
DATABASES = {
''default'': {
''ENGINE'': ''django.db.backends.mysql'',
''NAME'': ''TRYDJANGO'',
''USER'':''user_trydjango'',
''PASSWORD'':''passtry'',
''PORT'':''3306'',
''HOST'': ''localhost'',
}
}
Lo hago así para una base de datos llamada foo_db:
create database foo_db;
create user foo_user identified by ''foo_password'';
grant all on foo_db.* to ''foo_user''@''%'';
flush privileges;
Mi mensaje de error indicó que no se proporcionó una contraseña a la base de datos:
django.db.utils.OperationalError: (1045, "Acceso denegado para el usuario ''mylocalusername'' @ ''localhost'' (usando la contraseña: NO)")
manage.py
debe recoger las credenciales de acceso a la base de datos de settings.py
, que es un usuario específico de la base de datos (y, por supuesto, también la contraseña de ese usuario). Es un error de seguridad reaccionar a mi mensaje de error otorgando privilegios de inicio de sesión de base de datos al usuario local.
En mi caso, hubo problemas con settings.py
(estábamos reestructurando nuestro pipeline de compilación de django pipeline a webpack) y necesitaba eliminar partes relacionadas con pipeline de settings.py
para la solución. Es una pregunta por la que no recibí ningún mensaje de error de Python sobre los problemas de settings.py
, pero en su lugar recibí este error que no es local al problema real. Ese mensaje de error es solo un resultado transitivo del problema de origen. Una vez que arreglé el manage.py
, las credenciales se recogieron de la configuración de la BASE DE DATOS como de costumbre y todo salió bien.
En nuestro caso, estábamos usando django-pipeline
antes del webpack (más específicamente los paquetes pip
, django-pipeline-browserify==0.4.1
y django-pipeline==1.6.8
), así que una vez que hicimos la transición tuve que eliminar estas líneas de la configuración :
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''
Hasta que acababa de recibir mensajes de error sin sentido.
Parece que todo lo que he hecho es:
- soltar mi base de datos
- soltar el usuario
- recrear al usuario
- volver a crear la base de datos
- conceder a este usuario, privilegios de descarga
y luego comienza a funcionar.
Refiriéndome a la respuesta de @duffymo y cambiando la última declaración podría funcionar para mí.
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;
También cambie el número de puerto a ''3307'' si MySQl-python de 64 bits en settings.py, luego solo se producirá la conexión en Windows y MySql 5.7 django.
''3306'' para MySQl-python de 32 bits
DATABASES = {
''default'': {
''NAME'': ''graphite'',
''ENGINE'': ''django.db.backends.mysql'',
''USER'': ''graphite'',
''PASSWORD'': ''thepasswordyouchoose'',
''HOST'': ''localhost'',
''PORT'': ''3307''
}
}
Tuve el siguiente error:
ModuleNotFoundError: No hay un módulo llamado ''MySQLdb'' django.core.exceptions.ImproperlyConfigured: Error al cargar el módulo MySQLdb. ¿Instalaste mysqlclient?
Solución nº 01: verifique que si su usuario tiene permiso para acceder a la base de datos y realizar las operaciones DDL y DML en ella.
Solución # 02: Cambió la configuración de la base de datos en el archivo settings.py
Desde:
DATABASES = {
''default'': {
''ENGINE'': ''django.db.backends.mysql'',
''NAME'': ''db_name'',
''USER'': ''root''
}
}
A:
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'',
}
}
Y empezó a funcionar.
Yo uso esta configuración y funciona.
DATABASES = {
''default'': {
''ENGINE'': ''django.db.backends.mysql'',
''OPTIONS'': {
''read_default_file'': ''/etc/my.cnf'',
},
#''NAME'': os.path.join(BASE_DIR, ''db.sqlite3''),
}
}
por lo que entendí, algún usuario es un usuario invitado de DB y no el administrador, ¿verdad?
Si es así, desde su usuario administrador de la base de datos MySQL, otorgue a algún usuario el acceso a la tabla de entorno MySQL ''mysql.user'' de la siguiente manera:
GRANT SELECT EN mysql
. user
TO ''someuser'' @ ''%'';
A mi funciono ivan