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

前書き

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

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

前提条件

このチュートリアルは、Django Developmentシリーズの2番目のチュートリアルです。 このチュートリアルを実行するには、次を完了する必要があります。

  • Ubuntu 16.04サーバーでDjangoを使用するために必要なソフトウェアをインストールします。 sudo特権でサーバーをセットアップしていない場合、またはDjangoをまだインストールしていない場合は、このシリーズの最初のチュートリアル「https://www.digitalocean.com/community/tutorials/how-to-install」に従ってください。 -django-and-set-up-a-development-environment-on-ubuntu-16-04 [Djangoをインストールし、Ubuntu 16.04で開発環境をセットアップする方法]

  • このチュートリアルを進める前にMySQLをインストールします。 まだインストールしていない場合は、step 2 of “How To Install the Latest MySQL on Ubuntu 16.04”に従うことができます。これには、MySQLをインストールするためのコマンドが含まれています。

前提条件がインストールされ、Django開発環境がセットアップされたら、アプリの作成に進むことができます。

[[step-1 -—- create-the-initial-django-project-skeleton]] ==ステップ1—初期のDjangoプロジェクトスケルトンを作成します

アプリケーションの基礎を築くには、django-adminコマンドを使用してプロジェクトスケルトンを生成する必要があります。 この生成されたプロジェクトは、ブログアプリの基盤になります。

最初に行う必要があるのは、ホームディレクトリに移動することです。これは、次のコマンドで実行できます。

cd ~

次に、現在のディレクトリの内容を一覧表示できます。

ls

このシリーズの最初からゼロから始めた場合、ディレクトリが1つあることに気付くでしょう。

Outputdjango-apps

これには、すべてが正しくインストールされたことを確認するために生成したスケルトンプロジェクトが含まれています。

これは単なるテストであるため、このディレクトリは必要ありません。 代わりに、ブログアプリ用の新しいディレクトリを作成します。 作成しているアプリにとって意味のあるディレクトリを呼び出します。 例として、my_blog_appと呼びます。

mkdir my_blog_app

次に、新しく作成したディレクトリに移動します。

cd my_blog_app

次に、Python仮想環境を作成してアクティブ化します。

python3 -m venv env
. env/bin/activate

次に、Djangoをインストールします。

pip install django

my_blog_appディレクトリにいる間に、次のコマンドを実行してプロジェクトを生成します。

django-admin startproject blog

blog/ディレクトリに移動して、機能することを確認します。

cd blog

blog/ディレクトリは、前のdjango-adminコマンドを実行した後、現在のディレクトリ~/my_blog_app/に作成されているはずです。

lsを実行して、必要なアイテムが作成されたことを確認します。 blogディレクトリとmanage.pyファイルが必要です。

Outputblog manage.py

ブログアプリケーションの最初の開始を含むプロジェクトディレクトリを作成したので、次のステップに進みます。

[[step-2 -—- edit-settings]] ==ステップ2—設定の編集

スケルトンプロジェクトを生成したので、settings.pyファイルができました。

ブログでエリアに正しい時刻を関連付けるために、settings.pyファイルを編集して、現在のタイムゾーンを使用するようにします。 このlist of time zonesを参照として使用できます。 この例では、America/New_York時間を使用します。

次に、settings.pyファイルが配置されているディレクトリに移動します。

cd ~/my_blog_app/blog/blog/

次に、nanoまたは選択したテキストエディタを使用して、settings.pyファイルを開いて編集します。

nano settings.py

TIME_ZONEフィールドを編集しているので、次のようなファイルの下部セクションに移動します。

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行を変更して、現在のタイムゾーンに設定します。 この例では、ニューヨークのタイムゾーンを使用します。

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アプリケーションから提供されるファイルは、static filesと呼ばれます。 これには、JavaScript、CSS、画像など、完全なWebページをレンダリングするために必要なファイルが含まれます。

以下に示すように、settings.pyファイルの最後に移動し、STATIC_ROOTを追加します。

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を追加する必要があります。 ALLOWED_HOSTSと表示されているsettings.pyファイルの行に移動します。これは、settings.pyファイルの先頭に向かって表示されます。

settings.py

...
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True

ALLOWED_HOSTS = ['your server IP address']

# Application definition
...

サーバーのIPアドレスを角括弧と一重引用符の間に追加します。

行った変更に問題がなければ、CTRL +X、次にyを押してファイルを保存し、変更を確認します。

これで、settings.pyファイルが正常に編集され、適切なタイムゾーンが構成されました。 また、静的ファイルのパスを追加し、ip addressをアプリケーションのALLOWED_HOSTに設定しました。

この時点で、データベース接続のセットアップに進むことができます。

[[step-3 -—- install-mysql-database-connector]] ==ステップ3—MySQLデータベースコネクタをインストールします

プロジェクトでMySQLを使用するには、Djangoと互換性のあるPython 3データベースコネクタライブラリが必要です。 そこで、MySQLdbのフォークバージョンであるデータベースコネクタmysqlclientをインストールします。

mysqlclientのドキュメントによると、「MySQLdbは、PythonデータベースAPIを提供する人気のあるMySQLデータベースサーバーへのスレッド互換インターフェイスです。」主な違いは、mysqlclientにはPython3サポートを含めるという追加の利点があることです。

最初に行う必要があるのは、python3-devをインストールすることです。 次のコマンドを実行して、python3-devをインストールできます。

sudo apt-get install python3-dev

python3-devをインストールしたら、必要なPythonおよびMySQL開発ヘッダーとライブラリをインストールできます。

sudo apt-get install python3-dev libmysqlclient-dev

次の出力が表示されたら:

OutputAfter this operation, 11.9 MB of additional disk space will be used.
Do you want to continue? [Y/n]

yと入力し、ENTERを押して続行します。

次に、pip3を使用して、PyPiからmysqlclientライブラリをインストールします。 pipのバージョンはpip3を指しているので、pipを使用できます。

pip install mysqlclient

次のような出力が表示され、適切にインストールされていることが確認されます。

successfully installed mysqlclientCollecting mysqlclient
  Downloading mysqlclient-1.3.12.tar.gz (82kB)
    100% |████████████████████████████████| 92kB 6.7MB/s
Building wheels for collected packages: mysqlclient
  Running setup.py bdist_wheel for mysqlclient ... done
  Stored in directory: /root/.cache/pip/wheels/32/50/86/c7be3383279812efb2378c7b393567569a8ab1307c75d40c5a
Successfully built mysqlclient
Installing collected packages: mysqlclient
Successfully installed mysqlclient-1.3.12

次に、次のコマンドを使用して、MySQLサーバーをインストールします。

sudo apt-get install mysql-server

これで、PyPimysqlclientコネクタライブラリを使用してMySQLサーバーとMySQLクライアントが正常にインストールされました。

[[step-4 -—- create-the-database]] ==ステップ4—データベースを作成します

Djangoアプリケーションのスケルトンがセットアップされ、mysqlclientmysql-serverがインストールされたので、MySQLとの互換性のためにDjangoバックエンドを構成する必要があります。

MySQLサービスが実行されていることを確認します。

systemctl status mysql.service

次のような出力が表示されます。

mysql.service active● mysql.service - MySQL Community Server
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
   Active: active (running) since Sat 2017-12-29 11:59:33 UTC; 1min 44s ago
 Main PID: 26525 (mysqld)
   CGroup: /system.slice/mysql.service
        └─26525 /usr/sbin/mysqld

Dec 29 11:59:32 ubuntu-512mb-nyc3-create-app-and-mysql systemd[1]: Starting MySQL Community Server...
Dec 29 11:59:33 ubuntu-512mb-nyc3-create-app-and-mysql systemd[1]: Started MySQL Community Server.

代わりに次のような出力が表示される場合:

mysql.service inactive● mysqld.service
   Loaded: not-found (Reason: No such file or directory)
   Active: inactive (dead)

sudo systemctl start mysqlを実行して、mysql.serviceを再開できます。

これで、次のコマンドを使用してMySQL資格情報でログインできます。 ここで、-uはユーザー名を宣言するためのフラグであり、-pはこのユーザーにパスワードが必要であることをMySQLに通知するフラグです。

mysql -u db_user -p

次に、このdb_user’sパスワードを要求する出力が表示されます。

OutputEnter password:

パスワードを正しく入力すると、次の出力が表示されます。

OutputWelcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 6
Server version: 5.7.20-0ubuntu0.16.04.1 (Ubuntu)

Copyright (c) 2000, 2017, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

次のコマンドを使用して、MySQLに現在のデータベースを表示させることができます。

SHOW DATABASES;

データベースがまだ作成されていない場合、次のような出力が表示されます。

Output+--------------------+
| Database          |
+--------------------+
| information_schema |
| mysql             |
| performance_schema |
| sys               |
+--------------------+
4 rows in set (0.00 sec)

[.note]#Note:接続しようとしたときにエラーが発生した場合は、パスワードが正しいことと、MySQLが正しくインストールされていることを確認してください。 それ以外の場合は、tutorial on how to install and configure MySQL
#に再度アクセスしてください。

デフォルトでは、information_schemaMySQLperformance_schema、およびsysの4つのデータベースがすでに作成されています。 これらにはMySQLサーバー自体にとって重要な情報が含まれているため、これらに触れる必要はありません。

MySQLサーバーに正常にログインできたので、ブログのデータを保持する初期データベースを作成します。

MySQLでデータベースを作成するには、データベースに意味のある名前を使用して次のコマンドを実行します。

CREATE DATABASE blog_data;

データベースが正常に作成されると、次の出力が表示されます。

OutputQuery OK, 1 row affected (0.00 sec)

[。注意]##

Note:次の出力が表示された場合:

database creation failedERROR 1007 (HY000): Can't create database blog_data; database exists

次に、エラーが示すように、blog_dataという名前のデータベースがすでに存在します。

また、次のMySQLエラーが表示される場合、MySQL構文エラーがあることを意味します。 このチュートリアルに示されているとおりにコマンドを入力したことを確認します。

database creation failedERROR 1064 (42000): You have an error in your SQL syntax;

次に、使用可能なデータベースのリストにデータベースがリストされていることを確認します。

SHOW DATABASES;

blog_dataデータベースが出力に含まれるデータベースの中にあることがわかります。

output+--------------------+
| Database          |
+--------------------+
| information_schema |
| blog_data         |
| mysql                 |
| performance_schema |
| sys               |
+--------------------+
5 rows in set (0.00 sec)

ブログ用のMySQLデータベースが正常に作成されました。

MySQLサーバーを終了するときはいつでも、CTRL +Dを押してください。

[[step-5 --- add-the-mysql-database-connection-to-your-application]] ==ステップ5—MySQLデータベース接続をアプリケーションに追加します

最後に、データベース接続認証情報をDjangoアプリケーションに追加します。

[.note]#Note: Djangoのドキュメントによると、接続設定は次の順序で使用されることに注意してください:
-OPTIONS
-NAMEUSERPASSWORDHOSTPORT
-MySQL option files.

DjangoブログアプリをMySQLに接続するために必要な変更を加えましょう。

settings.pyファイルに移動し、現在のDATABASES行を次のように置き換えます。 MySQLをデータベースバックエンドとして使用し、どのファイルからデータベース接続認証情報を読み取るかを認識できるように、データベースディクショナリを構成します。

settings.py

...
# Database
# https://docs.djangoproject.com/en/2.0/ref/settings/#databases

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'OPTIONS': {
            'read_default_file': '/etc/mysql/my.cnf',
        },
    }
}
...

次に、設定ファイルを編集して、MySQL資格情報を取得します。 nanoをsudoとして使用してファイルを編集し、次の情報を追加します。

sudo nano /etc/mysql/my.cnf

my.cnf

...
[client]
database = db_name
user = db_user
password = db_password
default-character-set = utf8

この場合のデータベース名がblog_dataの場合、MySQLサーバーのユーザー名は作成したものであり、パスワードは作成したMySQLサーバーのパスワードです。 また、utf8がデフォルトのエンコーディングとして設定されていることに気付くでしょう。これは、MySQLでUnicodeデータをエンコードする一般的な方法です。

ファイルを編集したら、変更を有効にするためにMySQLを再起動する必要があります。

systemctl daemon-reload
systemctl restart mysql

MySQLの再起動には数秒かかるため、しばらくお待ちください。

[[step-6 -—- test-mysql-connection-to-application]] ==ステップ6—アプリケーションへの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).

You have 13 unapplied migration(s). Your project may not work properly until you apply the migrations for app(s): admin, auth, contenttypes, sessions.
Run 'python manage.py migrate' to apply them.

January 4, 2018 - 15:45:39
Django version 2.0.1, using settings 'blog.settings'
Starting development server at http://your-server-ip:8000/
Quit the server with CONTROL-C.

[.note]#Note:出力に未適用の移行があることがわかります。 ただし、心配しないでください。これについては、今後のチュートリアルで説明します。 これは、アプリケーションの初期設定には影響しません。 続けてください。

出力の指示に従い、推奨リンクhttp://your-server-ip:8000/に従って、Webアプリケーションを表示し、正しく機能していることを確認します。

Django Default Page

ページが上記のスクリーンショットのように表示される場合、Djangoアプリケーションは期待どおりに機能しています。

アプリのテストが終了したら、CTRL +Cを押してrunserverコマンドを停止できます。 これにより、プログラミング環境に戻ります。

Python環境を終了する準備ができたら、deactivateコマンドを実行できます。

deactivate

プログラミング環境を非アクティブ化すると、ターミナルコマンドプロンプトに戻ります。

結論

このチュートリアルでは、Djangoブログの最初の基礎を作成しました。 MySQLをインストールし、構成し、Djangoバックエンドに接続しました。 また、TIME_ZONEALLOWED_HOSTSなど、アプリケーションのsettings.pyファイルにいくつかの重要な情報を追加しました。

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

Related