Flask Practices #1, cookiecutter-flask を用いたプロジェクトの新規作成

[目次](https://qiita.com/coleyon/items/0c44b0cd88de82f27f2c) | [次回>>>](https://qiita.com/coleyon/items/94f757c66968bea8a506)

# 概要

flask のプロジェクトを [flask-cookiecutter](https://github.com/cookiecutter-flask/cookiecutter-flask) を使って楽にスマートに新規作成する方法です。

# 内容

Flask プロジェクトの初期コード生成を生成します。
python のパッケージ管理には ``pipenv`` を選択するケースです。
プロジェクト名は ``panels`` としました。

```powershell:cookiecutterでプロジェクト生成
> pipenv install
...
Successfully created virtual environment!
Virtualenv location: %VIRTUALENV_PATH%
> pipenv shell
> pipenv install cookiecutter
> pipenv run pip freeze
arrow==0.14.2
binaryornot==0.4.4
certifi==2019.6.16
chardet==3.0.4
Click==7.0
cookiecutter==1.6.0
future==0.17.1
idna==2.8
Jinja2==2.10.1
jinja2-time==0.2.0
MarkupSafe==1.1.1
poyo==0.4.2
python-dateutil==2.8.0
requests==2.22.0
six==1.12.0
urllib3==1.25.3
whichcraft==0.6.0
>
> cookiecutter https://github.com/cookiecutter-flask/cookiecutter-flask.git
full_name [Steven Loria]: YOURNAME
email [sloria1@gmail.com]: YOURNAME@example.com
github_username [sloria]: YOURNAME
project_name [My Flask App]: Web Panels
app_name [web_panels]: panels
project_short_description [A flasky app.]: panels app.
Select use_pipenv:
1 - no
2 - yes
Choose from 1, 2 (1, 2) [1]: 2
Select python_version:
1 - 3.7
2 - 3.6
Choose from 1, 2 (1, 2) [1]: 1
Select node_version:
1 - 12
2 - 10
3 - 8
Choose from 1, 2, 3 (1, 2, 3) [1]: 2
>
> exit
> ls -Name
panels           # ここ配下がPJROOT
Pipfile          # これは用済み
Pipfile.lock     # これは用済み
> exit
> pipenv --rm    # 用済みの仮想環境は抹消
> rm .\Pipenv*
> cd ${workspaceFolder}
> pwd

Path
----
${workspaceFolder}
```

```powershell:restructuredtextを個人的に慣れてるmarkdownに変換。本題じゃないです
${workspaceFolder}> .\pandoc -f rst -t gfm -o readme.md README.rst
${workspaceFolder}> rm README.rst
```

```powershell:リポジトリへpush
${workspaceFolder}> git init
${workspaceFolder}> git add .
${workspaceFolder}> git commit -m "first commit"
${workspaceFolder}> git remote add origin https://github.com/*.git
${workspaceFolder}> git push -u origin master
```

今回はここまで。次回は初回起動してみます。

# cookiecutter とは

Flask で初めて Webapp を作る際に、Boilerplate に割く時間を減らしたいけど、ベストプラクティスはある程度取り込んでおきたい。んで、知識やニーズが増えてきて、規模とライフサイクルが長いアプリを作ろうと思った時にも、大幅に設計思想を変えずに転用できるノウハウやコードを初めから利用したい。といった時には、``*-cookiecutter-*`` というテンプレが優秀です。Flask だけでなく、他フレームワーク（Djangoとか）でも用意されてます。

[Features](https://github.com/cookiecutter-flask/cookiecutter-flask#features) にはこんな風に書いています。

> * Bootstrap 4 and Font Awesome 4 with starter templates
> * Flask-SQLAlchemy with basic User model
> * Easy database migrations with Flask-Migrate
>
> ・・・

私は、以下の要素が良いと思いました。cookiecutter-flask は Features の各要素が必要・役に立つと分かる場合や、動作やお手本をまず見てみたい場合はいいサンプルです。

* [Flask-Bootstrap](https://pythonhosted.org/Flask-Bootstrap/) で UI デザインをできるだけ考ずに済ませられる（見た目デザインは主題じゃないので）
* [Flask-SQLAlchemy](https://flask-sqlalchemy.palletsprojects.com/en/2.x/#), [Flask-Migrate](https://flask-migrate.readthedocs.io/en/latest/) が入ってて、個人的には [ORM models](https://docs.sqlalchemy.org/en/13/#sqlalchemy-orm) の取り扱いがスムーズ
* [設定を環境変数に格納する考え方](https://12factor.net/ja/config) で作られている
* [Flask-WTForms](https://flask-wtf.readthedocs.io/en/stable/) が入っていて [Django の Forms](https://docs.djangoproject.com/ja/2.2/topics/forms/#the-django-form-class) と類似のイディオムとメリットが得られる
* [Flask-Login](https://flask-login.readthedocs.io/en/latest/) が入っていて ログイン認証 と RBAC の元ネタをゼロから作らなくていい
* [Flask-Webpack](https://github.com/nickjj/flask-webpack) が入っていて 静的リソースの管理ルール明確化がしやすい
* [Flask-Cache](https://pythonhosted.org/Flask-Cache/) が入っていて、キャッシュをかけたい場合につぶしが利く
* [Flask-DebugToolbar](https://flask-debugtoolbar.readthedocs.io/en/latest/#) - Debug時に HTTP Header, Template, Query 情報などが見やすいのは重要