Tornado Webフレームワークの基礎と実践

Tornadoとは

TornadoはPythonで書かれた非同期Webフレームワーク兼サーバーです。元々FriendFeedで開発され、2009年にオープンソース化されました。高いパフォーマンスとスケーラビリティが特徴で、C10k問題(1万同時接続)の解決を目指しています。

主な特徴

  • 非同期I/O処理による高い並行処理性能
  • 組み込みのHTTPサーバー
  • WebSocketサポート
  • 軽量な設計

基本的な実装例

# エンコーディング設定
# -*- coding: utf-8 -*-

import tornado.ioloop
import tornado.web

class MainHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("こんにちは、Tornado!")

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

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

HTTPサーバーの詳細設定

import tornado.httpserver

def setup_server():
    app = create_app()
    server = tornado.httpserver.HTTPServer(app)
    server.bind(8888)
    server.start(1)  # 単一プロセスで起動
    return server

if __name__ == "__main__":
    http_server = setup_server()
    tornado.ioloop.IOLoop.current().start()

設定オプションの管理

import tornado.options

tornado.options.define("server_port", default=8888, type=int, 
                      help="サーバーポート番号")
tornado.options.define("debug_mode", default=False, type=bool,
                      help="デバッグモード設定")

if __name__ == "__main__":
    tornado.options.parse_command_line()
    app = create_app()
    app.listen(tornado.options.options.server_port)
    tornado.ioloop.IOLoop.current().start()

リクエストハンドリング

class DataHandler(tornado.web.RequestHandler):
    def get(self):
        # クエリパラメータの取得
        param_value = self.get_argument('param', 'default')
        self.write(f"パラメータ値: {param_value}")
    
    def post(self):
        # ボディデータの取得
        data_content = self.get_argument('data', '')
        self.write(f"受信データ: {data_content}")

ルーティングの拡張

app = tornado.web.Application([
    (r"/", MainHandler),
    (r"/data", DataHandler),
    (r"/user/([0-9]+)", UserHandler),  # 数値IDの抽出
    (r"/category/(?P<name>\w+)", CategoryHandler)  # 名前付きグループ
])

デバッグ設定

app = tornado.web.Application([
    (r"/", MainHandler),
], debug=True, autoreload=True)

ファイルアップロード処理

class FileUploadHandler(tornado.web.RequestHandler):
    def post(self):
        uploaded_files = self.request.files
        if 'document' in uploaded_files:
            file_data = uploaded_files['document'][0]['body']
            with open('uploaded_file', 'wb') as f:
                f.write(file_data)
            self.write("ファイル受信完了")

タグ: Tornado Python web-framework async-io http-server

8月1日 13:36 投稿