第1回 作りながら覚えるFlask+Pipenv 〜フォルダごとのURLルーティングについて〜

#概要
●記事一覧
第1回 作りながら覚えるFlask+Pipenv 〜フォルダごとのURLルーティングについて〜 ※本記事
<a href="https://qiita.com/ryohei0109_develop/items/66b7dfc04292d15a6223">第2回 作りながら覚えるFlask+Pipenv 〜Zappaを使用してAWSへのデプロイ〜</a>
<a href="https://qiita.com/ryohei0109_develop/items/493f93de86edc1c4a858">第3回 作りながら覚えるFlask+Pipenv 〜AWSへのデプロイ後、ドメインでアクセスできるように設定〜</a>

FlaskフレームワークでWebアプリケーションを作成する際、
URLごとにフォルダを分けて管理するようにしたかった(ASP.NET MVC等のように)のですが、
調べても中々見つかりませんでした。
なので、Flaskアプリケーションの簡単な使い方と合わせて整理しておきます。
また、今回はPipenv環境で作成しています。

#フォルダ構成
まず初めに最終的なフォルダ構成を記載しておきます。

```
application
├── Pipfile
├── Pipfile.lock
├── flask_sample
│   ├── __init__.py
│   ├── static
│   │   └── images
│   │       └── test.jpg
│   ├── templates
│   │   ├── index.html
│   │   └── test
│   │       └── index.html
│   └── views
│       └── test.py
└── wsgi.py

```

#手順1.仮想環境の構築
任意の場所に「application」フォルダを作成します。

```
mkdir application
```

仮想環境を構築します。
※記事作成時点でzappaがpython3.9に対応していないため、3.8で構築しています。

```
pipenv --python 3.8
```

仮想環境に入ります。

```
pipenv shell
```

Flaskフレームワークをインストールします。

```
pipenv install Flask
```

#手順2.ファイルの準備

####「application/wsgi.py」

```python
#----------
#Flaskアプリケーション実行ファイル
#----------

from flask_sample import app

if __name__ == "__main__":
    app.run()
```

####「application/flask_sample/\__init\_\_.py」

```python
#----------
#Flaskアプリケーション立ち上げ後に呼び出されるファイル
#run.py→__init__.py
#----------

#Flaskとrender_template（HTMLを表示させるための関数）をインポート
from flask import Flask,render_template

#Flaskオブジェクトの生成
app = Flask(__name__)

#「/」もしくは「/index」へアクセスがあった場合に、「index.html」を返す
@app.route("/index")
@app.route("/")
def index():
    return render_template("index.html")

#viewsフォルダ以下のpyファイルをインポート (*複数ある場合は: test1, test2...)
from flask_sample.views import test
```

####「application/flask_sample/templates/index.html」
*URL「/」でアクセスするファイル

```html
<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
    <h1>Flaskサンプルアプリケーション</h1>
    <h2>ファイル場所: /flask_sample/templates/index.html</h2>
    </body>
</html>
```

####「application/flask_sample/templates/test/index.html」
*URL「/test/index/」でアクセスするファイル

```html
<!DOCTYPE html>
<html>
    <head>
    </head>
    <body>
    <h1>テストページです</h1>
    <h2>URL: /test</h2>
    <h2>ファイル場所: /flask_sample/templates/test/index.html</h2>
    <img src="/static/images/test.jpg" alt="テスト画像">
    </body>
</html>
```

####「application/flask_sample/views/test.py」

```python
#----------
#URL「/test/」以下のレンダリング処理
#----------

from flask import request, redirect, url_for, render_template, flash, session
from flask_sample import app

@app.route('/test', methods=['GET', 'POST'])
def show_entries():
    return render_template('test/index.html')
```

####「application/flask_sample/static/images/test.jpg」
任意の画像を設置して下さい。
「static」フォルダ以下は、画像ファイルやJavaScript、CSSファイル等を配置します。

#手順3.実行してみる
「run.py」を実行してあげるとFlaskアプリケーションが立ち上がります。

```terminal
(application) ryohei@MacBook-Pro-2 application % python run.py
 * Serving Flask app "flask_sample" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: off
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
```

正常に実行できると、最後に「Running on…」のあとにURLが表示されているのでブラウザでアクセスすると、
Flaskアプリケーションの確認ができます。

また、以下コマンドでデバッグモードで実行することも可能です。
※この場合、Flaskアプリケーション実行中にpythonファイルを変更すると、
自動的にリロードがかかってWebページが更新されます。
また、エラーがあった場合は、StackTraceも表示してくれます。

```
flask run --debugger --reload
```

#まとめ
URLとフォルダをいい感じに合わせるには、
「application/flask_sample/templates/」以下にフォルダを分けてあげると見やすくなります。
例: 「/product/list」のURLでアクセスさせたい場合、
フォルダ構造は「application/flask_sample/templates/product/list.html」になります。
その場合、「application/flask_sample/views/product.py」ファイルの追加と、
「application/flask_sample/\_\_init\_\_.py」に

```python
from flask_sample.views import product
```
の追記が必要になります。

お疲れ様です！

●記事一覧
第1回 作りながら覚えるFlask+Pipenv 〜フォルダごとのURLルーティングについて〜 ※本記事
<a href="https://qiita.com/ryohei0109_develop/items/66b7dfc04292d15a6223">第2回 作りながら覚えるFlask+Pipenv 〜Zappaを使用してAWSへのデプロイ〜</a>
<a href="https://qiita.com/ryohei0109_develop/items/493f93de86edc1c4a858">第3回 作りながら覚えるFlask+Pipenv 〜AWSへのデプロイ後、ドメインでアクセスできるように設定〜</a>