Djangoを使ってwebアプリケーションを作ろう
pythonを使ったwebフレームワークの中でも人気が高いDjango。
しかし日本語のドキュメントが少なかったり書籍も充実していなかったりで、
本格的な開発をしたくてもなかなかハードルが高いのが実情です。
ディレクトリ構成やデフォルトのUser, admin機能などDjango独特の
「クセ」もあるので、慣れるまで正直結構大変だと思います。
そこでこの記事では、自分としても早く慣れたいので数をこなしていく為に
開発の準備部分にあたる「開発環境構築」を備忘録として残していきます。
自分の為の記事という側面が強いので、説明が足りない部分があったり
逆に多すぎたりすることがあると思いますが、ご容赦ください。
スペック
macOS Mojave ver.10.14.2
PyCharm ver.2018.2.4
Python 3.7.1
Django 2.1.5
では早速始めます。
自分の好きな場所にまずディレクトリを作ります。
今回は自分の5番目のプロジェクトなのでproject5という名前で作ります。
$ mkdir project5
$ cd project5
仮想環境を作る
Djangoのドキュメントを見ていると、プロジェクトごとに仮想環境を作って
仮想環境で開発していることが多い印象があります。
プロジェクトごとにPythonやPythonパッケージを管理できるメリットがあるようです。
仮想環境を作らずローカル環境で生の状態で開発を行う場合、
PythonはPython2系とPython3系で使うコマンドが異なります。
例えばターミナルからローカルサーバーを立ち上げる際、
Python2系だと
$ python manage.py runserver
ですが、Python3系だと
$ python3 manage.py runserver
としなければなりません。
それだけかと思いますが、仮想環境だとPython3でも
$ python manage.py runserver
で通るので楽だし、余計なエラーに悩まされずに済みます。
では仮想環境を作っていきます
先ほど作ったディレクトリにいながら次のコマンドを打ち込みます。
$ python3 -m venv venv
$ source venv/bin/activate
これで仮想環境が有効化されました。
(venv) jibunnoMacBook-puro:project5 jibun$
先頭に(venv)
がついていたら仮想環境にいますよ、ということ。
ここから先は全て仮想環境上で作業を進めていきます。
Djangoをインストール
$ pip install Django
Collecting Django
Using cached https://files.pythonhosted.org/packages/36/50/078a42b4e9bedb94efd3e0278c0eb71650ed9672cdc91bd5542953bec17f/Django-2.1.5-py3-none-any.whl
Collecting pytz (from Django)
Using cached https://files.pythonhosted.org/packages/61/28/1d3920e4d1d50b19bc5d24398a7cd85cc7b9a75a490570d5a30c57622d34/pytz-2018.9-py2.py3-none-any.whl
Installing collected packages: pytz, Django
Successfully installed Django-2.1.5 pytz-2018.9
You are using pip version 10.0.1, however version 18.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command
Djangoが入りました。
最後の2行でpipのupgradeを促されていますが、
この先何かエラーが起きたらupgradeすることにして一旦進みます。
ちなみにpip
はPythonを便利に利用する為のパッケージを管理するツールです。
PyCharmのインストール
PyCharmはチェコのJetBrains社が開発した、Pythonの為の統合開発環境ソフトです。
有料、無料とありますが無料でも困らないくらい機能が充実しています。
pip install
をコンソールからだけでなくGUIででき、
初心者にも優しい仕様だと個人的には思っています。
私は以前からインストール済なので申し訳ないですが
インストール方法についてはここでは省略します^^;
PyCharmのターミナルで進めます
さて、既にプロジェクトを開始する為のディレクトリは作成済みなので、
PyCharmのスタート画面ではopen
を選択します。
先程mkdirしたディレクトリを選択し、画面が立ち上がります。
ここから先は、私はPyCharmのターミナルをして進めていきます。
デフォルトのターミナルが好きな方はそれでやっていただいても構わないです。
左下のPython Console
Terminal
TODO
からTerminal
を選択。
(venv) jibunnoMacBook-puro:project5 jibun$
この状態がセットされていると思われます。
されていなければ、仮想環境に入ってプロジェクトディレクトリに移動してください。
cookiecutterのインストール
次にcookiecutterをpipを使ってインストールします。
せっかくPyCharmのターミナルを使える状態にしたので、ターミナルを使ってインストール
しても良いのですがここは一旦GUIで初心者にも優しいインストール方法を試します。

まずはメニューバーのPyCharm
を選択


Project: プロジェクト名
を選択=>Project Interpreter
を選択

下の方に地味に選択されているプラスボタンを選択。
検索窓が出ますので、「cookiecutter」を入力して検索してみましょう。
左下のInstall Package
を選択するとインストールが開始されます。

installed successfully
が現れたらインストール成功です。
バツボタンで閉じて結構です。
cookiecutterとは
Djangoのディレクトリ構成は独特の性質があります。
具体的には、最初にmkdirで作った大元のディレクトリの直下に、
[プロジェクト]ディレクトリ(一つ)と[アプリケーション]ディレクトリ(複数可)を
同列に配置し、[プロジェクト]ディレクトリで各[アプリケーション]ディレクトリを
管理していくようなイメージになります。
ruby on railsのようにrails g...
で定型のディレクトリが
自動的に生成されるのとは異なって、Djangoはこれをある程度自分の手で
構築していかなければならず、さらに複雑なディレクトリ階層を一つ間違えただけで
プログラムは動いてくれなくなります。
cookiecutterは20個ほどの質問に回答するだけで(まあまあ多い)、
プロジェクトの雛形を生成してくれます。
慣れないうちはcookiecutterを使った方が早く開発の中身に取りかかれると思います。
cookiecutterの雛形はいくつかgithubに公開されていますが、
全部乗せ
のようなメニューが以下のコマンドで実現できます。
$ cookiecutter https://github.com/pydanny/cookiecutter-django
You've downloaded /Users/higashiyama/.cookiecutters/cookiecutter-django before. Is it okay to delete and re-download it? [yes]: yes
project_name [My Awesome Project]: project5
project_slug [project5]:
description [Behold My Awesome Project!]:
author_name [Daniel Roy Greenfeld]: hiroshimaeasyryo
domain_name [example.com]:
email [hiroshimaeasyryo@example.com]:
version [0.1.0]:
Select open_source_license:
1 - MIT
2 - BSD
3 - GPLv3
4 - Apache Software License 2.0
5 - Not open source
Choose from 1, 2, 3, 4, 5 (1, 2, 3, 4, 5) [1]:
timezone [UTC]: Asia/Tokyo
windows [n]: n
use_pycharm [n]: y
use_docker [n]: n
Select postgresql_version:
1 - 10.5
2 - 10.4
3 - 10.3
4 - 10.2
5 - 10.1
6 - 9.6
7 - 9.5
8 - 9.4
9 - 9.3
Choose from 1, 2, 3, 4, 5, 6, 7, 8, 9 (1, 2, 3, 4, 5, 6, 7, 8, 9) [1]:
Select js_task_runner:
1 - None
2 - Gulp
Choose from 1, 2 (1, 2) [1]:
custom_bootstrap_compilation [n]:
use_compressor [n]:
use_celery [n]:
use_mailhog [n]:
use_sentry [n]:
use_whitenoise [n]:
use_heroku [n]: n
use_travisci [n]:
keep_local_envs_in_vcs [y]:
debug [n]:
[INFO]: .env(s) are only utilized when Docker Compose and/or Heroku support is enabled so keeping them does not make sense given your current setup.
[SUCCESS]: Project initialized, keep up the good work!
たくさん聞かれますが、全部Enter押してデフォルト設定のままでも通ります。
今回はproject_name
とauthor_name
とwindows
とtimezone
だけ真面目に回答しました。
慣れてきたらこの質問の中身をしっかりと理解して自分の思い通りカスタマイズできるように
なっていきたいですね。

ディレクトリをこのように自動で生成してくれています。
ここから先はこのやり方が正攻法かわからないです
まずは、当たって砕けてみます
本来ならここでサーバー立ち上げるとすんなり先に進める、
という内容のドキュメントが多いですが、進まないですね。
$ python manage.py runserver
...
ModuleNotFoundError: No module named 'environ'
django-environ
をインストールするとこのエラーは解消します。
この状態からpython manage.py runserver
を実行すると、次のエラーが現れます。
ModuleNotFoundError: No module named 'crispy_forms'
次はcrispy_forms
が足りないらしいです。
コンソールでもpreferenceからインストールしても良いのでインストールします。

ModuleNotFoundError: No module named 'allauth'
次にインストールするのはこれです、allauth

名前に注意しないといけないことも慣れてきた感があります。
ModuleNotFoundError: No module named 'rest_framework'
次はこれだそうです。
果てしなさそうな感じがしますが、そのうち終わるので安心してください。

(省略)
この先似たような感じを繰り返していくので省略して必要なものだけ掲載します。
ModuleNotFoundError: No module named 'debug_toolbar'
ModuleNotFoundError: No module named 'django_extensions'
django.core.exceptions.ImproperlyConfigured: Error loading psycopg2 module: No module named 'psycopg2'
デフォルトのデータベースからMySQLへ変更する
postgresqlをデフォルトのSQLとしていることに絡み、
以下のエラーが発生します。
django.db.utils.OperationalError: could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/tmp/.s.PGSQL.5432"?
そもそもpostgresqlではなくMySQlを使いたかったので、
これを変更していきます。
まずはこれまでと同じようにPyMySQL
をインストール。
manage.py
のimport文直後に、
import pymysql
pymysql.install_as_MySQLdb()
を挿入。
/config/settings/base.py
の中の
DATABASES = 以下を次のように変更します
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.mysql',
'NAME': '[DB_name]', # DB名を設定
'USER': 'root', # DBへ接続するユーザIDを設定
'PASSWORD': '', # DBへ接続するユーザIDのパスワードを設定
'HOST': 'localhost',
'PORT': '8889',
'OPTIONS': {
'init_command': "SET sql_mode='STRICT_TRANS_TABLES'",
},
'TEST': {
'NAME': 'test_sample'
}
}
}
続いてMySQLにつなぎ、データベースを作成します
$ mysql -u root
mysql> CREATE DATABASE db_pr5;
Query OK, 1 row affected (0.07 sec)
mysql> USE db_pr5
Database changed
そして、マイグレーションを実行しDjangoとMySQLが接続できているか確認します。
一旦control+Dでmysqlを抜けてください
$ python manage.py migrate
...
Operations to perform:
Apply all migrations: account, admin, auth, contenttypes, sessions, sites, socialaccount, users
Running migrations:
Applying contenttypes.0001_initial... OK
Applying contenttypes.0002_remove_content_type_name... OK
Applying auth.0001_initial... 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 users.0001_initial... OK
Applying account.0001_initial... OK
Applying account.0002_email_max_length... OK
Applying admin.0001_initial... OK
Applying admin.0002_logentry_remove_auto_add... OK
Applying admin.0003_logentry_add_action_flag_choices... OK
Applying auth.0009_alter_user_last_name_max_length... OK
Applying sessions.0001_initial... OK
Applying sites.0001_initial... OK
Applying sites.0002_alter_domain_unique... OK
Applying sites.0003_set_site_domain_and_name... OK
Applying socialaccount.0001_initial... OK
Applying socialaccount.0002_token_max_lengths... OK
Applying socialaccount.0003_extra_data_default_dict... OK
いよいよサーバーを立ち上げます
$ python manage.py runserver
...
January 21, 2019 - 07:17:04
Django version 2.1.5, using settings 'config.settings.local'
Starting development server at http://127.0.0.1:8000/
Quit the server with CONTROL-C.

project5が立ち上がりました。



認証周りと管理画面を一気にセッティングできました。