web-dev-qa-db-ja.com

Django:mysql:1045、 "ユーザーのアクセスが拒否されました

ローカルコンピュータで数か月間、セットアップ全体が機能しています。
現在、リモートサイトにインストールしています。
新しいmysql DBを作成し、新しいユーザー(「someuser」)を作成して、次のように完全な権限を付与しました-

すべての特権を付与 'somepassword'によって識別される 'someuser' @ 'localhost'にGRANT OPTIONを指定して;

「python manage.py syncdb」を使用してdbを同期し、正しいテーブルが作成されました。私のsettings.pyにはこれと同じユーザーがいます。

しかし、アプリケーションを介してユーザーをログインさせようとしたときにDBにヒットすると、ログに次のように表示されます-

(1045、 "ユーザー 'someuser' @ 'localhost'のアクセスは拒否されました(パスワードを使用:YES)")

私はmysql(Djangoと同じボックスにインストールされています)を介してログインし、権限を確認しました。正しく表示されます-

Someuser @ localhostの許可
すべての特権を有効にする*。 *パスワード '* thesaltedpasswordOverHere'で識別される 'someuser' @ 'localhost'にGRANT OPTIONを指定

Djangoのrootユーザー/パスワードは、正しい方法とは思えないため、使用したくありません。

何が悪いのかについてのポインタはありますか?

26
PlanetUnknown

私はfoo_dbという名前のデータベースに対して次のようにします。

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

私の場合、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',
    }
}
7
Maritza Esparza

私のエラーメッセージは、データベースにパスワードが指定されていないことを示していました。

Django.db.utils.OperationalError:(1045、 "ユーザー 'mylocalusername' @ 'localhost'のアクセスが拒否されました(パスワード:NOを使用)")

manage.pysettings.pyからデータベースアクセス認証情報を取得する必要があります。これは特定のデータベースユーザーです(もちろん、そのユーザーのパスワードも同様です)。ローカルユーザーにデータベースログイン権限を付与してエラーメッセージに対応するのは、セキュリティ上の誤りです。

私の場合、settings.pyに問題があり(Djangoパイプラインからwebpackへのビルドパイプラインを再構築していました)、settings.pyからパイプライン関連のパーツを削除する必要がありました。修正のためです。これは、settings.pyの問題に関するpythonエラーメッセージが表示されなかったのはなぜですか?このエラーメッセージはソースの問題の推移的な結果にすぎません。manage.pyを修正すると、通常どおりDATABASE設定から認証情報が取得され、すべてがスムーズに行われました。


私たちのケースでは、webpackの前に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'

それまでは、無意味なエラーメッセージが表示されていました。

1
Csaba Toth

@ mattblang:

この場合、実際に使用されるsettings.pyファイルにもホストが設定されていると役立ちます。

私にとっては/etc/graphite/local_settings.pyですが、DATABASES Stanzasの値が間違っていました。ホストの場合:'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が正常に実行されます。

0
GeWi

@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
ReturnHttp402

私はこの構成を使用し、それは動作します。

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

次のエラーが発生しました:

ModuleNotFoundError:「MySQLdb」という名前のモジュールはありませんDjango.core.exceptions.ImproperlyConfigured:MySQLdbモジュールの読み込みエラー。 mysqlclientをインストールしましたか?

ソリューション#01:ユーザーにデータベースへのアクセス権限があり、データベースでDDLおよびDML操作を実行できるかどうかを確認します。

ソリューション#02:settings.pyファイルのデータベース構成を変更

From:

DATABASES = {

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

To:

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

And機能し始めました。

0

私がしたことはすべて次のようです:

  1. データベースをドロップ
  2. ユーザーを落とす
  3. ユーザーを再作成する
  4. データベースを再作成する
  5. このユーザーに付与し、特権をフラッシュします

そしてそれは働き始めます。

0
Eric

私が理解している限り、someuserはDBゲストユーザーであり、管理者ではありませんよね?

その場合は、MySQL DB管理者ユーザーから、次のようにMySQL環境テーブル 'mysql.user'へのアクセスをsomeuserに許可します。

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

私にはそれが働いた、イヴァン

0
Ivan Gruer

また、settings.pyでMySQl-python 64ビットの場合、ポート番号を「3307」に変更します。その後、WindowsとMySql 5.7 Djangoでのみ接続が行われます。

MySQl-python 32ビットの場合は「3306」

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