Djangoアプリを作成してデータベースに接続する方法

提供:Dev Guides
移動先:案内検索

序章

Django は、Pythonで記述された無料のオープンソースWebフレームワークです。 このツールは、スケーラビリティ、再利用性、および迅速な開発を可能にします。

このチュートリアルでは、MySQLデータベースに接続するブログWebサイトの初期基盤を設定する方法を学習します。 これには、django-adminを使用したブログWebアプリケーションのスケルトン構造の作成、MySQLデータベースの作成、およびWebアプリケーションのデータベースへの接続が含まれます。

Djangoは、ブログWebアプリケーションで作業するための開発環境を提供しますが、ブログをインターネット上で公開する前に、さらに多くの手順を実行する必要があります。

前提条件

このチュートリアルを完了するには、次のものが必要です。

すべてがインストールおよびセットアップされたら、最初のステップに進むことができます。

ステップ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_schemaMySQLperformance_schemasysの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 addressALLOWED_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
  • NAMEUSERPASSWORDHOSTPORT
  • 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_ZONEALLOWED_HOSTSimport osなどの重要な情報と、Djangoアプリケーションを接続するためのデータベースクレデンシャルを追加しました。 MySQL。 また、テストがスムーズに行われるようにファイアウォール設定を調整しました。

これらの基本的な設定と構成が完了したので、Djangoアプリケーションでモデルの開発と移行の適用を開始できます。