Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

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

More than 1 year has passed since last update.

はじめに

最近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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away