1. Tornadoの紹介
Tornadoは、非同期I/Oを活用したPythonのWebフレームワークです。高いパフォーマンスとスケーラビリティを提供し、リアルタイムWebサービスに適しています。
2. インストールとセットアップ
Tornadoのインストールは非常に簡単です。以下のコマンドを使用します。
pip install tornado
これでTornadoをプロジェクトに追加できます。
3. Hello Worldアプリケーション
基本的な「Hello, World」アプリを作成してみましょう。
import tornado.ioloop
import tornado.web
class MainHandler(tornado.web.RequestHandler):
def get(self):
self.write("Hello, world")
def make_app():
return tornado.web.Application([
(r"/", MainHandler),
])
if __name__ == "__main__":
app = make_app()
app.listen(8888)
tornado.ioloop.IOLoop.current().start()
- RequestHandler: リクエストを処理するための基本クラス。
- IOLoop: 非同期イベントループを管理。
4. 非同期プログラミングの理解
非同期I/Oは、I/O操作をブロックせずに他のタスクを実行できるプログラミング手法です。Tornadoはこれを活用し、高負荷のWebアプリケーションに適しています。
import tornado.gen
class AsyncHandler(tornado.web.RequestHandler):
@tornado.gen.coroutine
def get(self):
response = yield some_async_function()
self.write(response)
- @tornado.gen.coroutine: 非同期関数を定義するためのデコレータ。
- yield: 非同期操作を一時停止し、完了を待つ。
5. RequestHandlerとApplicationクラス
RequestHandler
はHTTPリクエストを処理するための基本クラスです。Application
はURLルーティングを設定し、アプリケーション全体を管理します。
class MyHandler(tornado.web.RequestHandler):
def get(self):
self.write("This is MyHandler")
app = tornado.web.Application([
(r"/my", MyHandler),
])
6. Tornadoでのルーティング
ルーティングは、URLパターンに基づいて適切なハンドラーを選択します。
app = tornado.web.Application([
(r"/", MainHandler),
(r"/about", AboutHandler),
])
- URLパターン: 正規表現を使用してURLを指定。
7. テンプレートの使用
Tornadoのテンプレートシステムを使用して動的なHTMLを生成できます。
# template.html
<html>
<body>
<h1>{{ title }}</h1>
<p>{{ content }}</p>
</body>
</html>
class TemplateHandler(tornado.web.RequestHandler):
def get(self):
self.render("template.html", title="Hello", content="Welcome to Tornado")
- render: テンプレートをレンダリングし、クライアントに送信。
8. フォームと入力の処理
フォームデータを処理する方法を学びます。
class FormHandler(tornado.web.RequestHandler):
def post(self):
name = self.get_argument("name")
self.write(f"Hello, {name}")
- get_argument: フォームやクエリパラメータからデータを取得。
9. WebSocketsとリアルタイムアプリケーション
WebSocketsを使用してリアルタイム通信を実現します。
class EchoWebSocket(tornado.websocket.WebSocketHandler):
def open(self):
print("WebSocket opened")
def on_message(self, message):
self.write_message(u"You said: " + message)
def on_close(self):
print("WebSocket closed")
- WebSocketHandler: WebSocketプロトコルを処理するためのハンドラー。
10. データベースの統合
Tornadoは直接データベースをサポートしていませんが、サードパーティライブラリを使用できます。ここでは、motor
を使ったMongoDBとの統合例を示します。
import motor.motor_tornado
class DBHandler(tornado.web.RequestHandler):
async def get(self):
client = motor.motor_tornado.MotorClient('mongodb://localhost:27017')
db = client.test_database
document = await db.test_collection.find_one({'key': 'value'})
self.write(document)
- motor: 非同期MongoDBドライバ。
11. セキュリティ機能
Tornadoは様々なセキュリティ機能を提供しています。例えば、XSRF保護です。
class SecureHandler(tornado.web.RequestHandler):
def get(self):
self.write('<form method="post"><input type="submit"></form>')
@tornado.web.addslash
def post(self):
self.write("Post request received")
- XSRF: クロスサイトリクエストフォージェリを防ぐためのトークン。
12. エラーハンドリングとデバッグ
エラーハンドリングを適切に行うことで、アプリケーションの信頼性を向上させます。
class ErrorHandler(tornado.web.RequestHandler):
def get(self):
try:
result = 1 / 0
except ZeroDivisionError:
self.write("Error: Division by zero")
- try/except: 例外をキャッチして処理。
13. Tornadoアプリケーションのテスト
テストはアプリケーションの品質を保証します。
import tornado.testing
class MyTestCase(tornado.testing.AsyncHTTPTestCase):
def get_app(self):
return tornado.web.Application([(r"/", MainHandler)])
def test_homepage(self):
response = self.fetch("/")
self.assertEqual(response.code, 200)
- AsyncHTTPTestCase: 非同期HTTPテストを行うためのクラス。
14. デプロイメント戦略
本番環境でのTornadoアプリのデプロイ方法について説明します。例えば、gunicorn
を使用したデプロイ。
gunicorn myapp:app --bind 0.0.0.0:8888
- gunicorn: Python WSGI HTTPサーバー。
15. 高度なトピックとベストプラクティス
スケーラビリティとパフォーマンスの向上のためのベストプラクティスを学びます。
- 非同期タスクキュー: Celeryなどを使用してバックグラウンドタスクを管理。
- 負荷分散: 複数のインスタンスを使用してトラフィックを分散。
各章は実践的なコード例と共に、Tornadoの機能を深く理解するための手助けとなるでしょう。