【Python】Djangoアプリケーションの作成と初期設定 / 2017年10月

#はじめに
スクレイピングで取得したデータを用いて、ログイン画面、レゴデータの管理、欲しいものリストの作成、更新ができるアプリケーションを作成しました。

「Djangoインストール~初期設定作成完了まで」を４節程度に分けて学習メモやエラーメモとして残して置こうと思います。

１節目の今回は「Djangoアプリケーションの構成、インストール、初期設定など」について記述します。
記述ミスなどがあれば編集依頼をいただけると幸いです..！

While editing...
--> 「Djangoのリクエスト処理の流れ（ビュー、テンプレート、ルーティング）（２）」
--> 「DjangoのモデルとCRUD機能提供管理サイト（３）」　
--> 「レゴ管理アプリケーションの作成（４）」 


##環境
MacbookPro Sierra 10.12.6
Python 3.6.3
Django 1.11.6

#Djangoアプリケーションの構成（インストール）
はじめに、アプリケーションを開発するための環境を準備します。venvを利用して仮想環境を構築してDjangoをインストール！

```
$ python3.6 -m venv env
$ . env/bin/activate
(env) $ pip install Django==1.11.6
```

コマンドを入力して、Djangoが正常にインストールされているかを確認します。

```
(env) $ python -m django --version
1.11.6
```

これでDjangoのインストールは完了です。
<details><summary>蛇足ですが、私が初めてDjangoを入れようとした頃は色んなエラーが出てハマった記憶があります。原因は「xcodeのCLTがN/A」でしたが、当時のエラーメッセージはその旨が直接的には記載していないし情報が少なかった気がします。しかも「xcode -V」でバージョン確認できていたしiOSアプリ開発で最新のものを使用していたので恥ずかしながら気付きにくかったです。DjangoCLTエラー記事は全然なかったのでそのうち書こうと思います。</summary></details>

##プロジェクトとアプリケーション
Djangoを用いてWebアプリケーションを開発する場合は、プロジェクトとアプリケーションと呼ばれる要素を作成して開発を進めます。
プロジェクトはDjangoのWebアプリケーション全体を表し、「全体設定、DB設定、CLT、その他」が含まれます。
アプリケーションは、具体的な機能を提供するWebアプリケーションになります。

参考：
[Djangoアプリケーションの単位](http://d.hatena.ne.jp/shuji_w6e/20080731/1217477232)
[Django Best Practiceへの道](http://akirachiku.com/2014/04/01/road-to-django-best-practice.html)

#プロジェクトの作成
Djangoをインストールするとdjango-adminコマンドが使用できるようになります。

プロジェクトやアプリケーションの作成、開発サーバーの起動などにdjango-adminコマンドや後述するmanage.pyコマンドを利用します。

プロジェクト作成コマンド：
django-admin startproject <プロジェクト名>

今回はプロジェクト名を「brickset_app」で作成します。

```
(env) $ django-admin startproject brickset_app
```

上記でプロジェクトに必要なファイルが生成されました。

<details><summary>因みに、(env)brickset_app $ tree -L 1 で確認してみるとこのようなツリーになっています。
.
|-- brickset_app
`-- manage.py

brickset_appの中には、
＿int__.py
settings.py
urls.py
wsgi.py
が入っています。

プロジェクトの構成

| ファイル（ディレクトリ） | 役割 |
|:----------:|:-----------:|
| brickset_app（外側）       | プロジェクトを格納するためのディレクトリ       |
| brickset_app（内側）       | brickset_appのパッケージ本体        |
| ＿int__.py       | Pythonパッケージであることを知らせるためのファイル        |
| settings.py       | プロジェクト全体の設定ファイル        |
| urls.py       | ルーティングの設定を記載するファイル        |
| wsgi.py       | WSGI用のファイル        |
| manage.py       | Djangoのコマンドラインツール        |

</summary></details>

以上でプロジェクトの作成は完了です。



<details><summary>もし、

(env) $ django-admin startproject brickset_app
>CommandError: [Errno 13] Permission denied: '/brickset_app'

のエラーが出たときは、「sudo django-admin startproject brickset_app」で解決できます。

ディレクトリを作る権限が無いというだけのようですので、pipのインストール時にsudoを付けて管理者権限で実行した方が無難かと存じます。
</details></summary>


##開発サーバーの起動
作成したプロジェクトが正常に動作するかを確認します。
開発サーバーの起動には manage.py　の runserver コマンドを使用します。

```
(env) $ cd brickset_app
(enc) $ 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 17, 2017 - 12:02:35
Django version 1.11.6, using settings 'brickset_app.settings'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.
```

http://127.0.0.1:8000/ に遷移してみると、
<img width="761" alt="スクリーンショット 2017-10-17 21.08.38.png" src="https://qiita-image-store.s3.amazonaws.com/0/200922/b2c6deff-891d-88ce-43fc-616b2cf99bb0.png">
のDjango初期画面が表示されれば成功です。

開発サーバーを停止するには ctl + c です。
これでDjangoアプリケーションの動作確認は完了です。

因みに、
>django.db.utils.OperationalError: unable to open database file

のエラーが出たときは、また「sudo python manage.py runserver」で通ります。


---
---
---

#プロジェクトの初期設定
プロジェクト作成が完了したので、開発を始める前にプロジェクト全体の初期設定を行います　。

##プロジェクトの日本語化
デフォルトはDjango初期画面は英語で表示されていますが、プロジェクトの設定ファイル（brickset_app/settings.py）の言語コードとタイムゾーンを下記のように変更して日本語化できます。

```
LANGUAGE = 'Ja'
TIME_ZONE = 'Asia/Tokyo'
```

##データベースの設定
次にプロジェクトで使用するデータベースの設定確認ですが、こちらもプロジェクトの設定ファイル（brickset_app/settings.py）に記載されています。
DjangoのデフォルトではSQLite3を使用する設定になっています。
MySQL、PostgreSQL、Oracleなどの他データベースを使用する場合は、追加の設定及びインストールが必要です。
[Django + MySQLでの設定](https://torina.top/detail/231/)
今回はSQLite3なので特にいじらないです。

##管理用テーブルの作成
Djangoではユーザー管理、セッション管理、管理サイトなどの機能が独立したアプリケーションとして提供されています。

設定ファイル内の INSTALLED_APPS にプロジェクトで有効にするアプリケーションを追加します。

デフォルトでは

| アプリケーション | 役割 |
|:----------:|:-----------:|
| django.contrib.admin    | 管理サイト       |
| django.contrib.auth     | 認証管理       |
| django.contrib.contenttypes   |コンテンツタイプ        |
| django.contrib.sessions   |セッション管理        |
| django.contrib.messages   | メッセージ管理       |
| django.contrib.staticfiles   |静的ファイル管理        |

が入っていますが、これらのアプリケーションを利用するためにはアプリケーション用のテーブルが必要です。

Djangoではマイグレーション機能を利用してテーブル作成や変更を行います。

テーブルを作成するには、manega.pyのmigrateコマンドを実行します。コマンドを実行すると、コンソールに次のような情報が表示されて、デフォルトで有効になっているアプリケーションに必要なテーブルが作成されます。

```
(env) $ python manage.py migrate
Operations to perform:
   Apply all migrations: admin, auth, contenttypes, sessions
Running migrations:
   Applying contenttyoes.001_initial...OK
   ...
```

以上でプロジェクトの初期設定は完了です。

#アプリケーションの実行
プロジェクトの作成と初期設定が完了したので、アプリケーションの設定をします。このアプリケーションではレゴデータの一覧機能、編集機能などを実装していきます。
アプリケーションを作成するには、python manage.py startapp <アプリケーション名＞ のように指定してコマンドを実行します。

```
(env) $ python manage.py startapp item
```

コマンドを実行するとプロジェクト内にitemディレクトリが生成されます。
>
(env) :brickset_app y$ ls
brickset_app	db.sqlite3	item		manage.py
 
>
(env) :brickset_app y$ tree -L 1
.
|-- brickset_app
|-- db.sqlite3
|-- item
`-- manage.py

| ファイル（ディレクトリ） | 役割 |
|:----------:|:-----------:|
| item       | itemアプリケーションのパッケージ用ディレクトリ       |
| ＿int__.py       | Pythonパッケージであることを知らせるためのファイル        |
| admin.py       | 管理サイトの設定を記載するファイル        |
| apps.py       | アプリケーションの構成情報を記載するファイル        |
| migrations       | マイグレーション用スクリプトを格納するディレクトリ        |
| models.py       | モデルを記載するファイル        |
| tests.py       | テストを記載するファイル        |
| views.py       | byu-を記載するファイル        |

以上でアプリケーションの作成は完了です。

##アプリケーションの登録

アプリケーションを作成すると、item/apps.py内にアプリケーションの構成クラスである ItemConfig クラスが作成されます。これはアプリケーション名を元に作成され、アプリケーションの構成情報を格納しています。

アプリケーションをプロジェクト内で有効にするには、設定ファイル内の INSTALLED_APPS に、　ItemConfig クラスを追加します。

```brickset_app/settings.py
# Application definition

INSTALLED_APPS = [
   'django.contrib.admin',
   'django.contrib.auth',
   'django.contrib.contenttypes',
   'django.contrib.sessions',
   'django.contrib.messages',
   'django.contrib.staticfiles',
   'item.apps.ItemConfig',   #追加だよ！
]
```

以上でアプリケーションの登録及び、初期設定は完了です。

#まとめ
本節ではDjangoアプリケーションの構成について記述しました。

また、Djangoのインストールを行い、プロジェクトとアプリケーションを作成し、初期設定を行いました。

次節はビュー、テンプレート、ルーティングについて記述予定です。


While editing...
--> 「Djangoのリクエスト処理の流れ（ビュー、テンプレート、ルーティング）（２）」
--> 「DjangoのモデルとCRUD機能提供管理サイト（３）」　
--> 「レゴ管理アプリケーションの作成（４）」