LoginSignup
190
179

More than 3 years have passed since last update.

PythonのWebフレームワークTornadoを使ってみる その1

Last updated at Posted at 2014-07-09

はじめに

最近Tornadoで遊んでいるので、その使い方をまとます。

今回は、ほぼ公式Topの焼き直しです。次回に期待してください。なお、質問や要望があればお答えします。

実行環境

私の実行環境は以下の通りですが、Pythonが動作する環境なら問題ないと思います。

  • CentOS release 6.5 (Final)
  • Python 2.6.6

関連記事

Tornadoとは

Tornadoとは、Pythonで書かれたWebフレームワーク/非同期通信ライブラリであり以下の特徴があります。

  • FriendFeedにより開発(現在はFacebook)
  • OpenSource(Apache 2.0)
  • Python2系, Python3系, PyPyで動作
  • シングルプロセス、シングルスレッド
  • シンプル
  • シンプルだから高速
  • シンプルだからスケーラブル(らしい)
  • テンプレートエンジンが同梱されている
  • 後発なので、いい所どりができる

以後、インストールからHello, worldまでを扱います。

Tornadoのインストール

Tornadoのインストールはpipで行います。

$ pip install tornado

なお、pipを導入してない方は以下のサイトを参考に導入するとよいでしょう。

pipなんて使いたくないよという場合は、tar.gzを落としてきて、いつも通り、setup.pyを使いましょう。

tar xvzf tornado-3.2.2.tar.gz
cd tornado-3.2.2
python setup.py build
sudo python setup.py install

Hello, world

インストールしてしまえば、あとはimportして適当なコードを書いて、listenするだけです。
ここでは、最も簡単な例として、ブラウザに"Hello, world"という文字列を表示してみます。
Hello, worldを表示するには、以下のコードを適当なディレクトリで適当な名前(ここではserver.py)を付けて保存して実行します。

ソースコード

server.py
#!/bin/env python
# -*- coding: utf-8 -*-
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()

起動

pythonにスクリプトを与えてやるだけです。

$ python server.py

ターミナルには何も表示されませんが、この状態でブラウザでアクセスすれば、"Hello, world"が表示されます。

閲覧

helloworld.png

もう少しだけ遊んでみる

文字列を表示するだけではつまらないので、せめてhtmlファイルを返すところまでやってみます。
スタイルシートとHTMLファイルを用意し、server.pyを以下のように書き換えます。
ここまでの知識で、適当にスタイル付けされた静的なページを返す大昔のWebサイトは構築できるはずです。

ディレクトリ構成

staticディレクトリにstyle.cssを、templatesディレクトリにindex.htmlを用意します。

$ tree --charset=x
.
|-- server.py
|-- static
|   `-- style.css
`-- templates
    `-- index.html

ソースコード

server.pyの主な変更点は以下の通りです。

  • Python2系でも3系でも動くように、"from _future_ import print_function"をimport
  • パスを扱うため"os"をインポート
  • writeメソッドの代わりに、renderメソッドを使う
  • templatesとstaticディレクトリを追加(意味は次回)
  • せっかくなので、serverが起動したことを標準出力に表示
server.py
#!/bin/env python
# -*- coding: utf-8 -*-
from __future__ import print_function
import os
import tornado.ioloop
import tornado.web

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

application = tornado.web.Application([
    (r"/", MainHandler)
    ],
    template_path=os.path.join(os.getcwd(),  "templates"),
    static_path=os.path.join(os.getcwd(),  "static"),
)

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

style.css
body {
  font-family:'Lucida Grande', 'Hiragino Kaku Gothic ProN', 'ヒラギノ角ゴ ProN W3', "MS Pゴシック", sans-serif;
  width: 80%;
  margin: 0 auto;
}
p {
  color:#BEAF71;
  font-size:200%;
}
index.html
<!DOCTYPE html>
<html>
  <head>
    <title>Hello, world</title>
    <link rel="stylesheet" href="{{ static_url("style.css") }}"/>
  </head>
  <body>
    <div id="container">
      <div id="main">
        <p>Hello, world</p>
      </div>
    </div>
  </body>
</html>

起動

$ python server.py
print("Server is up ...")

閲覧

確かにHTMLが返ってきていることがわかります。

helloworld.png
helloworld.png

190
179
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
190
179