Djangoプロジェクトの作成
django-admin startproject
それでは次回のために、Djangoプロジェクトを用意しておきましょう。これまで作成してきたディレクトリは削除しておいてください。
$ rm -rf mysite mysite2 mysite3 env
今回作るリポジトリの名前はmodern-djangoとしましょう。これまでやってきたことを踏まえて、Djangoプロジェクトを作成していきます。
$ mkdir modern-django $ cd modern-django $ python3 -m venv env $ source env/bin/activate (env) $ pip install django (env) $ django-admin startproject config .
以下のようなディレクトリ構成になっていればOKです。
modern-django ├── config ├── manage.py └── env
Djangoをインストールをしたので、requirements/base.txtにDjango==1.11.6
を書き加えておきましょう。
(env) $ mkdir requirements (env) $ vi requirements/base.txt (env) $ cat requirements/base.txt Django==1.11.6
Django Extensions
今後の開発の効率化のために、Django Extensionsもぜひインストールしておきましょう。Django Extensionsはmanage.py
に便利なコマンドを多数追加してくれます。たとえばshell_plusは、shell起動時に定義済みのモデルや頻繁に使うDjangoの機能を自動的にインポートしてくれます。
(env) $ pip install django-extensions (env) $ vi requirements/local.txt (env) $ cat requirements/local.txt -r base.txt django-extensions==1.9.1
Django Extensionsは開発時のみに使うので、requirements/local.txt
に記録しておきます。
Django Extensionsを利用可能とするためには、settingsにあるINSTALLED_APPSへ追加する必要があります。まずはsettings.pyをrequirementsと同様に用途ごとのファイルに分割しましょう。
(env) $ mkdir config/settings/ (env) $ mv config/settings.py config/settings/base.py (env) $ vi config/settings/local.py (env) $ cat config/settings/local.py from .base import * INSTALLED_APPS += ['django_extensions']
この状態でpython manage.py
と打つと、"Note that only Django core commands are listed as settings are not properly configured (error: The SECRET_KEY setting must not be empty.)."
というエラーが出てしまいます。settingsが正しく設定されていないというメッセージですが、この原因はmanage.pyの6行目にあります。
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings")
本来であればある環境に特化した書き方はよくないのですが、ここはとりあえずconfig.settings.local
に書き換えてアプリケーションが動くようにしましょう。
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "config.settings.local")
次回以降デプロイについて説明する際に、あらためて環境変数を用いるやり方で設定し直すこととします。
これでpython manage.py
が正常に動くはずです。Django Extensionsのコマンド群が利用できるようになったことを確認してみましょう。先ほど取り上げたshell_plusコマンドを実行してみると、以下のような出力となります。
(env) $ python manage.py shell_plus # Shell Plus Model Imports from django.contrib.admin.models import LogEntry from django.contrib.auth.models import Group, Permission, User from django.contrib.contenttypes.models import ContentType from django.contrib.sessions.models import Session # Shell Plus Django Imports from django.core.cache import cache from django.conf import settings from django.contrib.auth import get_user_model from django.db import transaction from django.db.models import Avg, Case, Count, F, Max, Min, Prefetch, Q, Sum, When, Exists, OuterRef, Subquery from django.utils import timezone from django.urls import reverse Python 3.6.3 (v3.6.3:2c5fed86e0, Oct 3 2017, 00:32:08) [GCC 4.2.1 (Apple Inc. build 5666) (dot 3)] on darwin Type "help", "copyright", "credits" or "license" for more information. (InteractiveConsole)
開発サーバの起動
それでは最後に、開発サーバを起動するところまでやっておきましょう。Djangoには標準で開発サーバが付属されており、デバッグ出力やリロードなど便利な機能を開発時に利用できます。
開発サーバの起動にはmanage.py runserver
コマンドを使います。
(env) $ python manage.py runserver Performing 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. October 16, 2017 - 01:23:15 Django version 1.11.6, using settings 'config.settings.local' Starting development server at http://127.0.0.1:8000/ Quit the server with CONTROL-C.
マイグレーションが適用されていないというメッセージが表示されていますが、のちほどマイグレーションについて説明するので今はこのままで問題ありません。
ブラウザからhttp://127.0.0.1:8000/にアクセスすると次の画面が表示されます。
Locale設定
デフォルトでは、Djangoは英語表記となっています。これから作っていくWebアプリケーションは日本対応のみを予定しているので、settings.pyのLANGUAGE_CODEとTIME_ZONEはデフォルト設定から変更しておきましょう。
LANGUAGE_CODE = 'ja' # デフォルト値: 'en-us' TIME_ZONE = 'Asia/Tokyo' # デフォルト値: 'UTC'
Djangoはファイルの変更を検知すると、開発サーバを自動的にリロードしてくれます。ブラウザに戻って再読み込みすると、英語表記から日本語表記に切り替わるのがわかります。
データベースの設定
次にデータベースのセットアップを行います。まずはconfig/settings/base.py
にあるデータベースの設定を見てみましょう。
# Database # https://docs.djangoproject.com/en/1.11/ref/settings/#databases DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } }
Djangoのデフォルトでは、データベースにSQLite3を使用するようになっています。ENGINEを変更することで、MySQLやPostgreSQL、Oracle Databaseなども利用できます。NAMEにはSQLite3ファイルのパスが指定されています。
それではデータベースを用意しましょう。テーブル作成・変更をするためには、マイグレーション機能を使います。manage.py migrate
コマンドを実行して、テーブルを作成しましょう。
(env) $ python manage.py migrate Operations to perform: Apply all migrations: admin, auth, contenttypes, sessions Running migrations: Applying contenttypes.0001_initial... OK Applying auth.0001_initial... OK Applying admin.0001_initial... OK Applying admin.0002_logentry_remove_auto_add... OK Applying contenttypes.0002_remove_content_type_name... OK Applying auth.0002_alter_permission_name_max_length... OK Applying auth.0003_alter_user_email_max_length... OK Applying auth.0004_alter_user_username_opts... OK Applying auth.0005_alter_user_last_login_null... OK Applying auth.0006_require_contenttypes_0002... OK Applying auth.0007_alter_validators_add_error_messages... OK Applying auth.0008_alter_user_username_max_length... OK Applying sessions.0001_initial... OK
migrateの実行が成功すると、config配下にdb.sqlite3ファイルが新たに作成されているのが確認できます。ファイルの中を見てみると、認証やマイグレーションに関するテーブルが作成されているのがわかります。
(env) $ sqlite3 config/db.sqlite3 SQLite version 3.16.0 2016-11-04 19:09:39 Enter ".help" for usage hints. sqlite> .table auth_group auth_user_user_permissions auth_group_permissions django_admin_log auth_permission django_content_type auth_user django_migrations auth_user_groups django_session sqlite>
管理サイト
Djangoの大きな特徴のひとつとして、データのCRUD操作を行うための管理サイトが始めから備わっていることが挙げられます。先ほどマイグレーションを実行して管理サイトに必要なテーブルは用意できたので、後は管理サイトへのログイン権限をもつユーザーの作成を行います。
この特権ユーザーを生成するにもコマンドが用意されています。manage.py createsuperuser
を実行して、ユーザー名・メールアドレス・パスワードを入力してください。
(env) $ python manage.py createsuperuser Username (leave blank to use 'massa142'): Email address: massa142@example.com Password: Password (again): Superuser created successfully.
開発サーバを起動後、http://127.0.0.1:8000/adminにアクセスして、作成したユーザーでログインしてみてください。
ログイン後、次の画面が表示されればOKです。
プロジェクトの準備はここまでにしておきます。ここまで解説したソースコードは以下から見ることができます。
終わりに
初回となる今回は、Djangoの特徴、環境構築、プロジェクト構成について紹介してきました。
次回はDjango REST frameworkの解説を中心として、実際にアプリケーションの開発をしながら進めていきます。