Python3でTornadoを動かしてみる

久しぶりの更新ですね。やっぱり習慣化してないとブログ書くのも大変ですね。。。
なので頑張って習慣化する為、1記事書きます!
内容は今勉強中のTornadoについてです。

Tornadoとは?

そもそもTornadoってなんでしょう?
Webフレームワークの一つですね。公式サイトは以下からどうぞ

http://www.tornadoweb.org/en/stable/#

公式サイトによると、

TornadoはFriendFeedで開発されたPythonのWebフレームワーク(非同期通信ライブラリ)です。
ノンブロッキングネットワークI / Oを使用することで、Tornadoは数万のオープン接続に拡張でき、
ロングポーリング、WebSocket、および各ユーザーへの長時間の接続が必要なその他のアプリケーションに最適です。

とあります。
つまりどゆこと??ってなりますよね。
とりあえず以下の特徴があるんだな程度の認識を持って頂ければよいかと。

FriendFeedが開発(Facebook社)
・Python2系, Python3系, PyPyで動作する
・シンプルだから高速に動作する
・テンプレートエンジンが同梱されている
・シングルプロセス、シングルスレッド

特にパフォーマンスに関しては目を見張るものがあります。
以下にベンチマーク結果を紹介しておきます。
Wiki参照です。
https://ja.wikipedia.org/wiki/Tornado_(Web%E3%82%B5%E3%83%BC%E3%83%90)

f:id:kyamisama:20180910181932p:plain

Tornadoのインストール

以下コマンドでTornadoをインストール

$ pip install tornado

Hello Worldを表示させる

公式サイトにサンプルソースコードが紹介されているのでそのままコピペして動かしてみる。

import tornado.ioloop
import tornado.web
 
	class MainHandler(tornado.web.RequestHandler):
    	def get(self):
        	self.write("Hello, world")
 
	def make_app():
    	return tornado.web.Application([
        	(r"/", MainHandler),
    ])
 
	if __name__ == "__main__":
    	app = make_app()
    	app.listen(8888)
    	tornado.ioloop.IOLoop.current().start()

簡単にコードを簡単に説明する。

class MainHandler(tornado.web.RequestHandler):
    	def get(self):
        	self.write("Hello, world")
    
RequestHandlerクラスのgetメソッドを継承し、HTTPリクエストGETが来た場合
self.writeにより”Hello World”を表示する。
    
def make_app():
    	return tornado.web.Application([
        	(r"/", MainHandler),
    ])

r"/"のrは正規表現を表す。"/"は現在の階層を差す。つまりカレントディレクトリである。
なのでlocalhost/にブラウザからアクセスするとMainHandkerクラスが呼ばれ、アクセスがGETであれば
Hello Worldをブラウザに表示する仕組みだ。

HTMLページをブラウザに表示させる

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write('''
	<!DOCTYPE html>
	<html>
	<head>
	</head>
	<body>
	<p><font size="10" color="#00ff00">Test!</font></p>
	</body>
	</html>
''')

class MainHandler2(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, samurai")

def make_app():
    return tornado.web.Application([
        (r"/", MainHandler),
	(r"/test/", MainHandler2),
    ])

if __name__ == "__main__":
    app = make_app()
    app.listen(8888)
tornado.ioloop.IOLoop.current().start()

サンプルコードにヒアドキュメント形式でHTMLをPythonプログラム内に埋め込んでいる。
実行して頂ければ分かると思うが、これでも一応HTNLを表示することは出来る。

おそらくこのような方法でHTMLを表示させたいんじゃないんだ!!って方が多いと思いますので
次回TornadoプログラムからHTMLファイルを呼び出す方法をご紹介したいと思います。

それでは今回ははここまでです。
閲覧しに来てくださった方ありがとうございました。