cookiecutter-djangoを使ってみた

Pythonには [cookiecutter](https://github.com/audreyr/cookiecutter) という仕組みがあり、それを使ってみた際のメモです。
[cookiecutterを使ってみる](https://qiita.com/aki/items/39cbe6de9c1a4c081ec4) とまるかぶりの内容だけど自分用の備忘録。

# どんな雛形がある？
[cookiecutter](https://github.com/audreyr/cookiecutter) の A Pantry Full of Cookiecutters とか [Django Packages](https://djangopackages.org/grids/g/cookiecutters/) を見ると色々あります。
Django関連ではメジャーみたいなのとPythonやBootstrapの新しいバージョンに対応してるので [cookiecutter-django](https://github.com/pydanny/cookiecutter-django) を使ってみます。[cookiecutter-django-crud](https://github.com/wildfish/cookiecutter-django-crud) とかも気になるけど、そちらははいずれ…

# 環境
cookiecutter-django が Python3.6、Django1.11 に対応となってるので、

- Python は 3.6
- Django は 1.11.8
- OS は Windows 10
- DB は PostgreSQL 10.1
- IDE は普段使ってる PyDev (Eclipse)

#  やってみる
[Creating your first app with Cookiecutter-Django](http://cookiecutter-django.readthedocs.io/en/latest/my-favorite-cookie.html) に従う。
virtualenvでPython仮想環境を使う説明になってるけど、自分のローカルでは Anaconda の仮想環境を使ってるのでPython仮想環境の手順はskipしていきます。

## cookiecutterをインストール
condaにないのでpipで。

```
> pip install "cookiecutter>=1.4.0"
```

## Python用の PostgreSQLクライアントをインストール

```
> conda install psycopg2
```

## プロジェクトフォルダを作成＆移動

```
> mkdir cookiecutter_sample
> cd cookiecutter_sample
```

## cookiecutter-django を適用
cookiecutter-django で cookiecutter を実行。

```
> cookiecutter https://github.com/pydanny/cookiecutter-django
```

下のように色々聞かれますが、お試しなので project_name と author_name ぐらい変更してenterキーを連打します。
自分はwinなので Windows だけ y に。

```
project_name [Project Name]: cookiecutter_sample
project_slug [cookiecutter_sample]:
author_name [Daniel Roy Greenfeld]: ping2shi2
email [you@example.com]:
description [A short description of the project.]:
domain_name [example.com]:
version [0.1.0]:
timezone [UTC]: Asia/Tokyo
use_whitenoise [y]:
use_celery [n]:
use_mailhog [n]:
use_sentry_for_error_reporting [y]:
use_opbeat [n]:
use_pycharm [n]:
windows [n]: y
use_docker [n]:
use_heroku [n]:
use_elasticbeanstalk_experimental [n]:
use_compressor [n]:
Select postgresql_version:
1 - 10
2 - 9.6
3 - 9.5
4 - 9.4
5 - 9.3
6 - 9.2
Choose from 1, 2, 3, 4, 5, 6 [1]:
Select js_task_runner:
1 - Gulp
2 - Grunt
3 - None
Choose from 1, 2, 3 [1]:
custom_bootstrap_compilation [n]:
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]:
```

すると mkdirした cookiecutter_sampleフォルダの下に、更に cookiecutter_sampleフォルダが作成され、中身は以下のとおり。

```
D:.
│  .coveragerc
│  .editorconfig
│  .gitattributes
│  .gitignore
│  .pylintrc
│  .travis.yml
│  CONTRIBUTORS.txt
│  env.example
│  gulpfile.js
│  LICENSE
│  manage.py
│  package.json
│  pytest.ini
│  README.rst
│  setup.cfg
│  
├─config
│  │  urls.py
│  │  wsgi.py
│  │  __init__.py
│  │  
│  └─settings
│          base.py
│          local.py
│          production.py
│          test.py
│          __init__.py
│          
├─cookiecutter_sample
│  │  __init__.py
│  │  
│  ├─contrib
│  │  │  __init__.py
│  │  │  
│  │  └─sites
│  │      │  __init__.py
│  │      │  
│  │      └─migrations
│  │              0001_initial.py
│  │              0002_alter_domain_unique.py
│  │              0003_set_site_domain_and_name.py
│  │              __init__.py
│  │              
│  ├─static
│  │  ├─css
│  │  │      project.css
│  │  │      
│  │  ├─fonts
│  │  │      .gitkeep
│  │  │      
│  │  ├─images
│  │  │      favicon.ico
│  │  │      
│  │  ├─js
│  │  │      project.js
│  │  │      
│  │  └─sass
│  │          custom_bootstrap_vars.scss
│  │          project.scss
│  │          
│  ├─templates
│  │  │  403_csrf.html
│  │  │  404.html
│  │  │  500.html
│  │  │  base.html
│  │  │  
│  │  ├─account
│  │  │      account_inactive.html
│  │  │      base.html
│  │  │      email.html
│  │  │      email_confirm.html
│  │  │      login.html
│  │  │      logout.html
│  │  │      password_change.html
│  │  │      password_reset.html
│  │  │      password_reset_done.html
│  │  │      password_reset_from_key.html
│  │  │      password_reset_from_key_done.html
│  │  │      password_set.html
│  │  │      signup.html
│  │  │      signup_closed.html
│  │  │      verification_sent.html
│  │  │      verified_email_required.html
│  │  │      
│  │  ├─bootstrap4
│  │  │  │  field.html
│  │  │  │  
│  │  │  └─layout
│  │  │          field_errors_block.html
│  │  │          
│  │  ├─pages
│  │  │      about.html
│  │  │      home.html
│  │  │      
│  │  └─users
│  │          user_detail.html
│  │          user_form.html
│  │          user_list.html
│  │          
│  └─users
│      │  adapters.py
│      │  admin.py
│      │  apps.py
│      │  models.py
│      │  urls.py
│      │  views.py
│      │  __init__.py
│      │  
│      ├─migrations
│      │      0001_initial.py
│      │      __init__.py
│      │      
│      └─tests
│              factories.py
│              test_admin.py
│              test_models.py
│              test_urls.py
│              test_views.py
│              __init__.py
│              
├─docs
│      conf.py
│      deploy.rst
│      docker_ec2.rst
│      index.rst
│      install.rst
│      make.bat
│      Makefile
│      __init__.py
│      
├─requirements
│      base.txt
│      local.txt
│      production.txt
│      test.txt
│      
└─utility
        install_os_dependencies.sh
        install_python_dependencies.sh
        requirements-jessie.apt
        requirements-trusty.apt
        requirements-xenial.apt
```

cookiecutter_sampleフォルダが１階層余分に見えます。手動で１つ減らして進めると後で失敗するので、このまま Pydev へ。

## Pydev プロジェクトを作成
Eclipseで ファイル>新規>その他 のメニューを選択し、Pydev Django プロジェクトを選択。

<img src="https://qiita-image-store.s3.amazonaws.com/0/112763/65902555-3087-ee9e-3cca-4e68186ba730.png"  width=50%>

[次へ] ボタンクリックして [プロジェクト名] に 上で作成したプロジェクト名を入力して[次へ]をクリック。

![新規PydevDjangoPJ_2.png](https://qiita-image-store.s3.amazonaws.com/0/112763/e8a7c185-9815-5cf2-b72a-acc5fb1364b5.png)

その後は環境に合わせて入力してから[完了]クリックします。
すると、先ほど \cookiecutter_sample\cookiecutter_sample\ 配下に出来たファイルが \cookiecutter_sample\ 配下に移動してくれます。
自分で移動すると、雛形のコードと構成がずれて動かなくなるので注意です。

## DBの接続情報を設定
当然ですが事前に CREATE DATABASE はしておいて下さい。
プロジェクト直下の env.example というファイルにDBの接続情報を追加します。

```
DATABASE_URL="postgres://user:pass@127.0.0.1:port_no/db_name"
```

env.example のファイル名 を .env に変更します。
.env は環境変数を設定できるファイルみたいです。

## .envファイル を有効に
.envファイルを有効にするため、
config\settings\base.py を以下のように修正します。

```py
# READ_DOT_ENV_FILE = env.bool('DJANGO_READ_DOT_ENV_FILE', default=False)
READ_DOT_ENV_FILE = env.bool('DJANGO_READ_DOT_ENV_FILE', default=True)
```

## Django settings module を Pydev に設定

プロジェクトのプロパティを開いて Pydev で起動する際の Django settings module に config.settings.local を設定します。

![新規PydevDjangoPJ_3.png](https://qiita-image-store.s3.amazonaws.com/0/112763/d1bc79ec-3936-48bc-19be-43efc900d682.png)

## Djangoのマイグレーションを実行

コマンドでも良いですが Pydev から実行する場合は、プロジェクトを選択して右クリック>Django>マイグレーション をクリック

![Django Migration.png](https://qiita-image-store.s3.amazonaws.com/0/112763/fb5e1dd5-200f-be42-24c6-e8bb1e56cb5b.png)

## 起動
Eclipseでデバッグ起動してブラウザでアクセスすると

![起動画面.png](https://qiita-image-store.s3.amazonaws.com/0/112763/23273f48-5100-d067-ef3b-b4fca63816bf.png)


![サインアップ.png](https://qiita-image-store.s3.amazonaws.com/0/112763/f42a7d5c-9168-6871-3b6b-b99538f039d1.png)

のように、サインアップ、ログイン、ログアウト、パスワード変更、などユーザーアカウントまわりの機能は出来ています。
また、設定時にenter連打した環境まわりをちゃんと設定すると、そちらも自動的に出来るようです。
これにビジネスロジックだけ追加しよう。ということです。

おしまい。