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("ファイル受信完了")