はじめに
webServer APIServerとして、かんたん・すぐれている(と思っている)Tornadoを何回かにわけて紹介したいと思います
[Web-WF Python Tornado その1]
(https://qiita.com/sin_hayasi/private/c5af3b21e7abda196cfd)
Web-WF Python Tornado その2 (この記事
[Web-WF Python Tornado その3(Openpyexcelの紹介)]
(https://qiita.com/sin_hayasi/private/55b4314f3190cdf2f2ec)
対象
フルスタックエンジニア、フロントエンジニア、これから勉強しようと思っている人、Pythonが好きな人
Python3.6以上、tornadoがインストールされている
ゴール
今回はベースになるフォルダ構成や各種ファイルの説明、https化 までを説明
フォルダ構成
config
- ・config.py
- tornadoの起動設定を記述
- ・intDb.py
- DBの設定を記述
controller
- ・apiController.py
- get, postなどに対応する部分を記述
- ・basehandler.py
- authなど全体的に処理したいものを記述
- ・mainController.py
- loginやauthに関わる処理を記述
data
- ・sample.sql
- プロジェクトのDDL
lib
- ・common.py
- 共通的に使うclass, 関数など
model
- ・model.py
- テーブル定義、データモデル(プロジェクトの大きさで更に分割)
static
- ・css/
- css関連
- ・fonts/
- font関連
- ・images/
- 画像関連
- ・js/
- javascriptモジュール関連
- ・tag/
- このsampleではriot.jsを使用していたのでさり気なくアピール
- ・favicon.ico
- favicon
templates
- ・base.html/
- script読み込みなど側部分を記述
- ・index.html
- メインコンテンツを記述
- ・login.html/
- ログイン画面を記述
- ・topmenu.html
- トップメニュー(ヘッダー)を記述
test
- ・test/
- 各種テストファイル
app.py
- ・app.py
- tornado起動部分、対応urlを記述
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
はい、僕はいつもこんなシンプルな画面をプロジェクトのミニマムとして用意しています
https / options
さらに、sslに対応させ、あると便利なoptionsの設定もしておきます
ソース&閲覧
起動部分の抜粋
cert.pemとprivkey.pemは「オレオレ自己認証」で作成
server側はLet's Encryptを利用して運用することも出来ます
(自動化出来るとはいえ更新が面倒です)
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()
# logレベルの設定
# logging = "WARNING"
logging = "ERROR"