🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

1回答

2088閲覧

djangoのプロジェクト内のsettings.pyにおけるDATABASEの設定について

sasakuta

総合スコア4

Django

DjangoはPythonで書かれた、オープンソースウェブアプリケーションのフレームワークです。複雑なデータベースを扱うウェブサイトを開発する際に必要な労力を減らす為にデザインされました。

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ubuntu

Ubuntuは、Debian GNU/Linuxを基盤としたフリーのオペレーティングシステムです。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2019/11/28 08:17

前提・実現したいこと

Ubuntuでdjango+apache2とmySQLを起動してweb構築をしています。
外部のpcからサーバーpcにアクセスし、サイトを表示させることは出来たのですが、管理サイトからログインする際に、以下のようなエラーが発生しました。djangoのプロジェクト内にあるsettings.pyのDATABASEに問題があると思い、HOST部分をlocalhostからmySQLサーバーのIPアドレスに設定することで、管理サイトにログインすることができました。しかし、ここで変更前に指していたlocalhostとは何だったのでしょうか?私の知識では127.0.0.1として自分自身のipアドレスを指すので、mysqlサーバーが同一ipにある以上localhostでも問題が無いように思えるのですが、下記のエラーが発生していました。どなたか何故localhostではアクセスできないのかご教授ください。

発生している問題・エラーメッセージ

OperationalError at /admin/login/ (1698, "Access denied for user 'root'@'localhost'") Request Method: POST Request URL: http://IPアドレス/mysite/admin/login/?next=/mysite/admin/ Django Version: 2.2.7 Exception Type: OperationalError Exception Value: (1698, "Access denied for user 'root'@'localhost'") Exception Location: /usr/local/lib/python3.6/dist-packages/MySQLdb/connections.py in __init__, line 171 Python Executable: /usr/bin/python3 Python Version: 3.6.8 Python Path: ['/home/ui/mysite', '/usr/lib/python36.zip', '/usr/lib/python3.6', '/usr/lib/python3.6/lib-dynload', '/usr/local/lib/python3.6/dist-packages', '/usr/lib/python3/dist-packages'] Server time: 木, 28 11月 2019 15:57:15 +0900

該当のソースコード

python3

1 DATABASES = { 2 'default': { 3 'ENGINE': 'django.db.backends.mysql', 4 'NAME': 'db', 5 'USER': 'root', 6 'PASSWORD': 'pass', 7 'HOST': 'localhost', //localhostだとアクセス出来ない 8 'PORT': '3306', 9 } 10 } 11

mySQL

1+------------------+-----------+ 2| user | host | 3+------------------+-----------+ 4| root | % | 5| debian-sys-maint | localhost | 6| mysql.session | localhost | 7| mysql.sys | localhost | 8| root | localhost | 9| test | localhost | 10+------------------+-----------+

試したこと

settings.pyのDATABASESのHOSTをlocalhostにして外部pcから管理サイトへのログイン -> 接続失敗
同じくHOSTをlocalhostにしてサーバーpcから管理サイトへのログイン -> 接続失敗

settings.pyのDATABASESのHOSTをサーバーPCのipaアドレスに設定して外部pcから管理サイトへのログイン -> 接続成功
同じ条件でサーバーpcから管理サイトへのログイン -> 接続成功

補足情報(FW/ツールのバージョンなど)

Ubuntu 18.04.3 LTS
Python 3.6.8
Django 2.2.7
Apache/2.4.29 (Ubuntu)
mysql Ver 14.14

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

t_obara

2019/11/28 09:43

セキュリティ上の観点からrootの設定はおやめください。管理者用のユーザーを作成して利用するようにしましょう。
sasakuta

2019/11/29 06:48

t_obaraさんご指摘ありがとうございます。rootの設定というのは rootユーザーであればどのhostからでもログイン可能 の設定のことでしょうか?
guest

回答1

0

MySQLがrootユーザーのlocalhostからのログインを拒否するからです。

投稿2019/11/28 08:28

tatamyiwathy

総合スコア1045

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sasakuta

2019/11/28 09:23

tatamyiwathyさん回答ありがとうございます。回答の中で質問があります。MySQLがrootユーザーのlocalhostからのログインを拒否するとの事ですが、それはどういうことでしょうか。 コマンドラインで $ mysql -u root -p でmysqlにログインをしますが、ここで-hを省略した場合はlocalhostがhostとして設定されmysqlにログインするはずですよね。 Djangoを用いた場合ではlocalhostからのアクセスをすべて拒否するようになるということですか?
tatamyiwathy

2019/11/28 09:40

あ、失礼しました。$ mysql -u root -p でログインできてるのですね。 "GRANT ALL PRIVILEGES ON データベース.* TO 'root'@'localhost';"で権限を与えてないんじゃないかと推測しましたが、別の原因のようですね。
sasakuta

2019/11/29 06:45

返信遅れてしまい、すみません。どうやら「localhost」と指定したときと「localhostに当たるipアドレス」を直接指定した時では振る舞いが異なるようです。(参照 https://b.l0g.jp/mysql/user-at-localhost/) そこで、root@localhost と root@%の権限を確認してみたところ、以下のような結果となりました。 mysql> show grants for 'root'@'localhost'; +---------------------------------------------------------------------+ | Grants for root@localhost | +---------------------------------------------------------------------+ | GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost' WITH GRANT OPTION | | GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION | +---------------------------------------------------------------------+ 2 rows in set (0.00 sec) mysql> show grants for 'root'@'%'; +----------------------------------------------------------------+ | Grants for root@% | +----------------------------------------------------------------+ | GRANT USAGE ON *.* TO 'root'@'%' | | GRANT ALL PRIVILEGES ON `db`.* TO 'root'@'%' WITH GRANT OPTION | +----------------------------------------------------------------+ root@localhostでは全てのデータベースに対しての権限を付与されているのに対して、root@%ではdbへの変更のみ全ての権限が付与されているように見えます。この二つの権限の差異によって接続が出来なくなっているのでしょうか。
tatamyiwathy

2019/11/29 08:14

localhostを指定したときはroot@localhostの権限が適用されて、127.0.0.1はroot@%が適用されるのでしょうね。MySQL的にはlocalhostと127.0.0.1は違う扱いをしてるのだと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問