Categories: PythonTornado

【Tornado入門】Hello World

この記事ではPythonのWebフレームワークであるTornadoのインストールとHelloWorldを見ていきます。

Tornadoの特徴

  • Facebook社が買収してオープンソースになった。
  • ノンブロッキングなイベント駆動フレームワーク。
  • C10K問題を解決できるだけのパフォーマンスがある。
  • ユーザ認証、セキュリティ、ソーシャルネットワーク、データベース、WebAPIなども扱える。

Tornadoのインストール

pip install tornadoコマンドでインストールできます。

PS C:\Users\testuser\OneDrive\IT\Python> pip install tornado
Collecting tornado
  Downloading tornado-6.1.tar.gz (497 kB)
     ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 497.4/497.4 KB 6.2 MB/s eta 0:00:00
  Preparing metadata (setup.py) ... done
Using legacy 'setup.py install' for tornado, since package 'wheel' is not installed.
Installing collected packages: tornado
  Running setup.py install for tornado ... done
Successfully installed tornado-6.1
PS C:\Users\testuser\OneDrive\IT\Python>

Hello Worldの実行

任意のディレクトリに任意の名前(server.py)で以下のコードを記述して実行するだけでブラウザでHello Worldが確認できます。
以下のコードではポート番号を8888と指定しているのでブラウザのURL欄にはhttp://localhost:8888/を入力してアクセスします。
サーバを止めるには、VScodeのコンソール上でctrl+cを入力します。

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

application = tornado.web.Application([
    (r"/", MainHandler),
])

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

コード解説

以下のコードは、tornado.web.RequestHandlerを継承したMainHandlerというクラスを作成しています。 これがTornadoのリクエストハンドラクラスになります。
def get(self):はHTTPリクエストのGETを表しています。 POSTリクエストを行いたい場合はdef post(self):とします。

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("Hello, world")

以下のコードはhttp://localhost/にアクセスしてきたときにMainHandlerを呼び出すという意味になります。 TornadoではHTTPリクエストのパスをマッチさせるために正規表現を使えます。

application = tornado.web.Application([
    (r"/", MainHandler),
])

以下のコードがTornadoアプリケーションを起動している処理です。

if __name__ == "__main__":
    application.listen(8888)
    tornado.ioloop.IOLoop.instance().start()

クエリパラメータを取得する

クエリ文字を受け取るには以下のように記述します。 self.get_argument('fruits', 'いちご')の第一引数がクエリパラメータです。第二引数は、パラメータが指定されなかった場合のデフォルト値です。

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        result = self.get_argument('fruits', 'いちご')
        self.write(result)

ブラウザでhttp://localhost:8888/?fruits=bananaにアクセスすれば「banana」と表示されます。 ブラウザでhttp://localhost:8888/にアクセスすれば「いちご」と表示されます。

複数のクエリパラメータを受け取る

複数のクエリ文字を受け取る場合には、以下のように記述します。
ブラウザでhttp://localhost:8888/?fruits=strawberry&yasai=tamanegiにアクセスすれば「strawberry tamanegi」と表示されます。

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        val1 = self.get_argument('fruits', 'いちご')
        val2 = self.get_argument('yasai', 'たまねぎ')
        self.write(val1 + ' ' + val2)

静的ページを表示する。

任意のHTMLページを返すには、ハンドラクラスで以下のように記述します。

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("index.html")

HTTPステータスコードを返却するには

self.set_status(200)
issiki_wp