Web-WF Python Tornado その２


# はじめに
webServer APIServerとして、かんたん・すぐれている（と思っている）Tornadoを何回かにわけて紹介したいと思います

[Web-WF Python Tornado その１]
(https://qiita.com/sin_hayasi/private/c5af3b21e7abda196cfd)
Web-WF Python Tornado その２ （この記事
[Web-WF Python Tornado その３（Openpyexcelの紹介）]
(https://qiita.com/sin_hayasi/private/55b4314f3190cdf2f2ec)

## 対象
フルスタックエンジニア、フロントエンジニア、これから勉強しようと思っている人、Pythonが好きな人

Python3.6以上、tornadoがインストールされている

## ゴール
今回はベースになるフォルダ構成や各種ファイルの説明、https化 までを説明

# フォルダ構成
（あくまで個人のオススメです）
<img width="256" alt="tornado_folder.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672217/d6c15424-833b-303c-2e02-a45df09cb1ff.png">


#### config
<dl>
  <dt>・config.py</dt>
  <dd>tornadoの起動設定を記述</dd>
  <dt>・intDb.py</dt>
  <dd>DBの設定を記述</dd>
</dl>

#### controller
<dl>
  <dt>・apiController.py</dt>
  <dd>get, postなどに対応する部分を記述</dd>
  <dt>・basehandler.py</dt>
  <dd>authなど全体的に処理したいものを記述</dd>
  <dt>・mainController.py</dt>
  <dd>loginやauthに関わる処理を記述</dd>
</dl>

#### data
<dl>
  <dt>・sample.sql</dt>
  <dd>プロジェクトのDDL</dd>
</dl>

#### lib
<dl>
  <dt>・common.py</dt>
  <dd>共通的に使うclass, 関数など</dd>
</dl>

#### model
<dl>
  <dt>・model.py</dt>
  <dd>テーブル定義、データモデル（プロジェクトの大きさで更に分割）</dd>
</dl>

#### static
<dl>
  <dt>・css/</dt>
  <dd>css関連</dd>
  <dt>・fonts/</dt>
  <dd>font関連</dd>
  <dt>・images/</dt>
  <dd>画像関連</dd>
  <dt>・js/</dt>
  <dd>javascriptモジュール関連</dd>
  <dt>・tag/</dt>
  <dd>このsampleではriot.jsを使用していたのでさり気なくアピール</dd>
  <dt>・favicon.ico</dt>
  <dd>favicon</dd>
</dl>

#### templates
<dl>
  <dt>・base.html/</dt>
  <dd>script読み込みなど側部分を記述</dd>
  <dt>・index.html</dt>
  <dd>メインコンテンツを記述</dd>
  <dt>・login.html/</dt>
  <dd>ログイン画面を記述</dd>
  <dt>・topmenu.html</dt>
  <dd>トップメニュー（ヘッダー）を記述</dd>
</dl>

#### test
<dl>
  <dt>・test/</dt>
  <dd>各種テストファイル</dd>
</dl>

#### app.py
<dl>
  <dt>・app.py</dt>
  <dd>tornado起動部分、対応urlを記述</dd>
</dl>

app.py を以下のように変更して外部ファイルをインポート

``` python:app.py
import tornado.ioloop
import tornado.web
# 外部ファイルをインポート
from controller.mainController import *
from controller.apiController import *
```

　全体的なイメージとしてはhtml部分をvue.jsだったりnuxt.jsで作成した静的ファイルを置くか、tornadoをapiサーバーのみに使い、nuxt.js等から利用するという使い方が良いのかなと思います
　このあたりはプロジェクトの規模だったりメンバーの構成に合わせて選択するしか無いかなと考えているのですが、だれかベストプラクティスありますか？


## 起動＆閲覧
ターミナルで

```
$ python app.py
```

<img width="831" alt="tornado_main.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672217/d35e7b7e-5aac-02b9-d25c-1923f7dd9bdd.png">

はい、僕はいつもこんなシンプルな画面をプロジェクトのミニマムとして用意しています

# https / options

さらに、sslに対応させ、あると便利なoptionsの設定もしておきます

## ソース＆閲覧

起動部分の抜粋
cert.pemとprivkey.pemは「オレオレ自己認証」で作成
server側はLet's Encryptを利用して運用することも出来ます
（自動化出来るとはいえ更新が面倒です）


```python:app.py
if __name__ == '__main__':
    options.parse_command_line()
    if os.path.exists(BASE_DIR + '/config/config.py'):
        options.parse_config_file(BASE_DIR + '/config/config.py')
    http_server = tornado.httpserver.HTTPServer(application, ssl_options={
        "certfile": "/etc/cert/cert.pem",
        "keyfile": "/etc/cert/privkey.pem",
        "ssl_version": ssl.PROTOCOL_TLSv1_2,
        "ciphers": "EECDH+HIGH+AES!SHA:!ADH:!RC4:!MD5:!aNULL:!eNULL:!SSLv2:!LOW:!EXP:!PSK:!SRP:!DSS:!KRB5",
    })
    http_server.listen(8888)
    tornado.ioloop.IOLoop.current().start()
```

```python:config.py
# logレベルの設定
# logging = "WARNING"
logging = "ERROR"
```

<img width="740" alt="tornado_main2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/672217/0b73b4f6-f95c-9423-20f7-682661b0fe82.png">