Djangoアプリを作成してデータベースに接続する方法
序章
Django は、Pythonで記述された無料のオープンソースWebフレームワークです。 このツールは、スケーラビリティ、再利用性、および迅速な開発を可能にします。
このチュートリアルでは、MySQLデータベースに接続するブログWebサイトの初期基盤を設定する方法を学習します。 これには、django-admin
を使用したブログWebアプリケーションのスケルトン構造の作成、MySQLデータベースの作成、およびWebアプリケーションのデータベースへの接続が含まれます。
Djangoは、ブログWebアプリケーションで作業するための開発環境を提供しますが、ブログをインターネット上で公開する前に、さらに多くの手順を実行する必要があります。
前提条件
このチュートリアルを完了するには、次のものが必要です。
- ルート以外の
sudo
対応ユーザーとファイアウォールを備えたUbuntu20.04サーバー。 Ubuntu20.04初期サーバーセットアップガイドに従ってください。 - データベースとして機能するようにインストールされたMySQL。 Ubuntu20.04にMySQLをインストールする方法に関するチュートリアルに従ってください。
- Python環境がセットアップされました。 これについては、Python3をインストールしてUbuntu20.04サーバーにプログラミング環境をセットアップする方法のチュートリアルに従ってください。
すべてがインストールおよびセットアップされたら、最初のステップに進むことができます。
ステップ1—データベースの作成
Djangoは多くの一般的なデータベース管理システムをサポートしていますが、このガイドではDjangoをMySQLデータベースに接続することに焦点を当てています。 これを行うには、MySQLインスタンスにデータベースを作成する必要があります。また、Djangoがデータベースへの接続に使用できるMySQLユーザープロファイルを作成する必要があります。
これを設定するには、次のコマンドを使用して、ルートMySQLユーザーとしてMySQLデータベースに接続します。
sudo mysql
プロンプトが変わると、MySQLサーバーにいることがわかります。
次のコマンドを使用して、現在のデータベースを検査します。
SHOW DATABASES;
データベースをまだ作成していないと仮定すると、次のような出力が表示されます。
Output+--------------------+ | Database | +--------------------+ | information_schema | | mysql | | performance_schema | | sys | +--------------------+ 4 rows in set (0.00 sec)
デフォルトでは、information_schema
、MySQL
、performance_schema
、sys
の4つのデータベースがすでに作成されています。 MySQLサーバー自体にとって重要な情報が含まれているため、これらに触れる必要はありません。
代わりに、ブログのデータを保持する初期データベースを作成してください。
MySQLでデータベースを作成するには、データベースに意味のある名前を使用して、次のコマンドを実行します。
CREATE DATABASE blog_data;
データベースが正常に作成されると、次の出力が表示されます。
OutputQuery OK, 1 row affected (0.00 sec)
注:次のエラーが発生する可能性があります。
OutputERROR 1007 (HY000): Can't create database blog_data; database exists
これは、blog_data
という名前のデータベースがすでに存在していることを示しています。
また、次のMySQLエラーが発生した場合は、MySQL構文エラーがあることを意味します。 このチュートリアルに示されているとおりにコマンドを入力したことを確認してください。
OutputERROR 1064 (42000): You have an error in your SQL syntax;
データベースが使用可能なデータベースの1つとしてリストされていることを確認します。
SHOW DATABASES;
blog_data
データベースは、出力に含まれるデータベースの中にリストされているはずです。
Output+--------------------+ | Database | +--------------------+ | information_schema | | blog_data | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec)
次に、Djangoが新しいデータベースを操作するために使用する別のMySQLユーザーアカウントを作成します。 特定のデータベースとアカウントを作成すると、管理とセキュリティの観点からサポートできます。 このガイドではdjangouserという名前を使用しますが、関連する名前を自由に使用してください。
このアカウントを作成し、パスワードを設定して、作成したデータベースへのアクセスを許可します。 まず、ユーザーを作成し、次のコマンドを入力してパスワードを設定します。 この例では、password
を置き換えるために、データベースに強力なパスワードを選択することを忘れないでください。
CREATE USER 'djangouser'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
djangouserが設定したデータベースに完全にアクセスできる必要があることをデータベースに通知します。
GRANT ALL ON blog_data.* TO 'djangouser'@'localhost';
これで、データベースとユーザーアカウントができました。それぞれ、Django専用に作成されています。 MySQLの現在のインスタンスが最近行った変更を認識できるように、特権をフラッシュします。
FLUSH PRIVILEGES;
これが完了したら、EXIT;
と入力するか、CTRL + D
を押して、MySQLサーバーを終了できます。
ステップ2—MySQLオプションファイルを作成する
MySQL接続の詳細をDjango構成ファイルで指定する代わりに、オプションファイルに保存できます。 多くのMySQLプログラムは、起動オプションや接続の詳細などの情報について、オプションファイル(構成ファイルとも呼ばれます)を読み取ることができます。 これは、データベースのログイン資格情報を1か所に保存するだけでよいので便利です。
好みのテキストエディタでmy.cnf
構成ファイルを開き、MySQLクレデンシャルを更新します。 ここではnano
を使用します。
sudo nano /etc/mysql/my.cnf
次の行を追加し、関連情報を含めます。
/etc/mysql/my.cnf
… [client] database = blog_data user = djangouser password = your_actual_password default-character-set = utf8
utf8
がデフォルトのエンコーディングとして設定されていることに気付くでしょう。これは、MySQLでUnicodeデータをエンコードする一般的な方法です。 詳細が正しいことを確認したら、ファイルを保存して閉じます。 nano
を使用してファイルを編集した場合は、CTRL + X
を押してからY
を押して変更を確認することで編集できます。
ファイルを編集したら、変更を有効にするためにMySQLを再起動する必要があります。
sudo systemctl daemon-reload sudo systemctl restart mysql
MySQLの再起動には数秒かかることに注意してください。しばらくお待ちください。
ステップ3—最初のDjangoプロジェクトスケルトンを作成する
このステップでは、django-admin
コマンドを使用してプロジェクトスケルトンを生成することにより、アプリケーションの基礎を築きます。
ブログアプリを作成するディレクトリに移動します。 そのディレクトリ内に、アプリをビルドするための特定のディレクトリを作成します。 構築しているアプリにとって意味のあるディレクトリを呼び出します。 例として、my_blog_app
という名前を付けます。
mkdir my_blog_app
次に、新しく作成したディレクトリに移動します。
cd my_blog_app
次に、Djangoでの作業に使用するプログラミング環境に移動します。 既存のものを使用することも、新しいものを作成することもできます。 これをenv
と呼びますが、意味のある名前を使用する必要があります。
python3 -m venv env
作成したら、アクティブ化できます。
. env/bin/activate
まだインストールしていない場合は、この環境にDjangoをインストールします。
pip install django
my_blog_app
ディレクトリにいる間に、次のコマンドを実行してプロジェクトを生成します。
django-admin startproject blog
blog/
ディレクトリに移動して、機能することを確認します。
cd blog
次に、ls
を実行して、必要なファイルとディレクトリがプロジェクトフォルダ内に作成されたことを確認します。
ls
出力には、blog
ディレクトリとmanage.py
ファイルが一覧表示されます。
Outputblog manage.py
ブログアプリケーションの最初の開始を含むプロジェクトディレクトリを作成したので、次のステップに進むことができます。
ステップ4—MySQLデータベースコネクタをインストールする
プロジェクトでMySQLを使用するには、Djangoと互換性のあるPython3データベースコネクタライブラリが必要です。 このステップでは、そのようなデータベースコネクタの1つであるmysqlclient
をインストールする方法の概要を説明します。これは、MySQLdb
のフォークバージョンです。
まず、必要なMySQL開発ヘッダーとライブラリをインストールします。
sudo apt install libmysqlclient-dev default-libmysqlclient-dev
次に、pip
を使用してwheel
パッケージをインストールします。 Wheel は、PythonPackageIndexからモジュールをインストールするためにPythonで使用されるパッケージ形式です。 ホイールパッケージからPythonプログラムをインストールする方が、ソースコードからパッケージをビルドするよりも一般的に高速でリソース効率が高くなります。 ホイールとしてパッケージ化されたプログラムをインストールして操作するには、最初にwheel
パッケージがインストールされていることを確認する必要があります。
pip install wheel
次に、mysqlclient
のインストールに進みます。
pip install mysqlclient
クライアントが正しくインストールされたことを確認する、次のような出力が表示されます。
Output... Successfully installed mysqlclient-2.1.0
これで、PyPimysqlclient
コネクタライブラリを使用してMySQLクライアントが正常にインストールされました。
ステップ5—設定の編集
以前にdjango-admin
を実行すると、settings.py
という名前のDjangoの構成ファイルが作成されました。 すべてを正しく機能させるには、このファイルのデフォルト設定のいくつかを変更する必要があります。
ファイルを編集するには、選択したテキストエディタでファイルへのパスを開きます。
nano ~/my_blog_app/blog/blog/settings.py
ブログでお住まいの地域に正しい時刻を関連付けるには、settings.py
ファイルを編集して現在のタイムゾーンを使用するようにします。 このタイムゾーンのリストを参照として使用できます。 この例では、America/New_York
時間を使用します。
ファイル内で、ファイルの下部セクションの近くにあるTIME_ZONE
フィールドに移動します。
〜/ my_blog_app / blog / blog / settings.py
... # Internationalization # https://docs.djangoproject.com/en/2.0/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'UTC' USE_I18N = True USE_L10N = True USE_TZ = True ...
TIME_ZONE
行を変更して、現在のタイムゾーンに設定されるようにします。 この例では、ニューヨークのタイムゾーンを使用します。
〜/ my_blog_app / blog / blog / settings.py
... # Internationalization # https://docs.djangoproject.com/en/2.0/topics/i18n/ LANGUAGE_CODE = 'en-us' TIME_ZONE = 'America/New_York' USE_I18N = True ...
次に静的ファイルのパスを追加する必要があるため、ファイルを開いたままにします。 Django Webアプリケーションから提供されるファイルは、静的ファイルと呼ばれます。 これには、JavaScript、CSS、画像など、Webページ全体をレンダリングするために必要なファイルを含めることができます。
settings.py
ファイルの最後に移動し、STATIC_ROOT
を追加します。
〜/ my_blog_app / blog / blog / settings.py
... # Static files (CSS, JavaScript, Images) # https://docs.djangoproject.com/en/2.0/howto/static-files/ STATIC_URL = '/static/' STATIC_ROOT = os.path.join(BASE_DIR, 'static')
静的ファイルのタイムゾーンとパスを追加したので、許可されたホストのリストにIPを追加します。 settings.py
ファイルのALLOWED_HOSTS
と表示されている行に移動すると、settings.py
ファイルの先頭に移動します。 角かっこで囲まれたサーバーのIPアドレスを一重引用符で囲んで追加します。
〜/ my_blog_app / blog / blog / settings.py
... # SECURITY WARNING: don't run with debug turned on in production! DEBUG = True ALLOWED_HOSTS = ['your_server_IP_address'] # Application definition ...
次に、ディレクトリにさまざまな機能を提供するPythonOSモジュールを追加します。 このモジュールがないと、Djangoインターフェースの使用を開始するように管理ユーザーを設定するときにエラーが発生します。 これを行うには、それぞれのオペレーティングシステムで動作するos
モジュールをインポートする必要があります。 from pathlib import Path
行の上にimport os
行を追加します。
〜/ my_blog_app / blog / blog / settings.py
... import os from pathlib import Path # Build paths inside the project like this: BASE_DIR / 'subdir'. ...
これまで、settings.py
ファイルを編集して、適切なタイムゾーンが構成されていることを確認しました。 また、静的ファイルのパスを追加し、アプリケーションのip address
をALLOWED_HOST
に設定し、Python OSモジュールをインポートして、後で管理ユーザーを設定できるようにしました。
ファイルに追加する最後のスニペットは、DjangoブログアプリケーションをMySQLに接続するためのデータベース接続クレデンシャルです。 このために、ファイル内でDATABASES
辞書を見つけます。 デフォルトでは次のようになります。
〜/ my_blog_app / blog / blog / settings.py
... # Database # https://docs.djangoproject.com/en/3.2/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': BASE_DIR / 'db.sqlite3', } } ...
DATABASES
ディクショナリのENGINE
およびNAME
オプションを次の行に置き換えます。
〜/ my_blog_app / blog / blog / settings.py
... # Database # https://docs.djangoproject.com/en/3.0/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.mysql', 'OPTIONS': { 'read_default_file': '/etc/mysql/my.cnf', }, } } ...
'ENGINE': 'django.db.backends.mysql'
行は、組み込みのMySQLデータベースバックエンドを使用するようにDjangoに指示します。 read_default_file
オプションは、前に編集したMySQLオプションファイルである/etc/mysql/my.cnf
を指します。 これにより、ステップ1で作成したMySQLデータベースに接続するための関連する接続の詳細をどこで見つけることができるかがDjangoに通知されます。
Djangoはデータベース接続設定を次の順序で読み取ることに注意してください。
OPTIONS
NAME
、USER
、PASSWORD
、HOST
、PORT
- MySQLオプションファイル
この例のようにOPTIONS
設定内でMySQLオプションファイルをDjangoにポイントすると、NAME
設定よりも優先されます。そうしないと、オプションファイルをポイントした場合にオーバーライドされます。 OPTIONS
設定外。
この時点で、ファイルを保存して閉じることができます。
次に、以下を実行して、移行の変更を確認します。
python manage.py makemigrations
次に、migrate
を実行して、変更が確実に行われるようにします。
python manage.py migrate
変更が移行されたので、Django管理インターフェースに使用する管理ユーザーを作成できます。 createsuperuser
コマンドでこれを行います。
python manage.py createsuperuser
ユーザーのユーザー名、メールアドレス、パスワードの入力を求められます。
この情報を入力したら、テストを可能にするためにファイアウォール設定の調整に進むことができます。
ステップ6—ファイアウォール設定の調整
Django Webアプリケーションをテストする前に、ファイアウォール設定が調整されていることを確認する必要があります。 ufw
設定を変更して、ポート8000
へのアクセスを許可することから始めます。
sudo ufw allow 8000
ステータスをチェックして、これらの権限設定が正常に更新されたことを確認します。
sudo ufw status
OutputStatus: active To Action From -- ------ ---- OpenSSH ALLOW Anywhere 8000 ALLOW Anywhere OpenSSH (v6) ALLOW Anywhere (v6) 8000 (v6) ALLOW Anywhere (v6)
これで、ファイアウォール設定が適切に調整され、次のステップで接続をテストできるようになりました。
ステップ7—アプリケーションへのMySQL接続をテストする
これで、Djangoの構成がMySQLサーバーを正しく検出することを確認できます。 これは、サーバーを実行することで実行できます。 失敗した場合は、接続が正しく機能していないことを意味します。 それ以外の場合、接続は有効です。
まず、次のディレクトリに移動します。
cd ~/my_blog_app/blog/
そこから、次のコマンドを実行します。
python manage.py runserver your-server-ip:8000
次のような出力が表示されます。
OutputPerforming system checks... System check identified no issues (0 silenced). October 25, 2021 - 19:50:58 Django version 3.2.9, using settings 'blog.settings' Starting development server at http://your-server-ip:8000/ Quit the server with CONTROL-C.
注:出力に適用されていない移行があることに気付くでしょう。 心配しないでください。これはアプリケーションの初期設定には影響せず、続行できます。
出力の指示に従い、推奨リンクhttp://your-server-ip:8000/
に従って、Webアプリケーションを表示し、正しく機能していることを確認します。
ページが上のスクリーンショットのように表示される場合、Djangoアプリケーションは期待どおりに機能しています。
アプリのテストが終了したら、CTRL + C
を押してrunserver
コマンドを停止します。 これにより、プログラミング環境に戻ります。
Python環境を離れる準備ができたら、deactivate
コマンドを実行できます。
deactivate
プログラミング環境を非アクティブ化すると、ターミナルコマンドプロンプトに戻ります。
結論
このチュートリアルでは、Djangoブログの最初の基盤を作成しました。 MySQLをインストール、構成し、Djangoバックエンドに接続しました。 また、アプリケーションのsettings.py
ファイルに、TIME_ZONE
、ALLOWED_HOSTS
、import os
などの重要な情報と、Djangoアプリケーションを接続するためのデータベースクレデンシャルを追加しました。 MySQL。 また、テストがスムーズに行われるようにファイアウォール設定を調整しました。
これらの基本的な設定と構成が完了したので、Djangoアプリケーションでモデルの開発と移行の適用を開始できます。