初心者向けPythonのTornadoを使った超高速WEBアプリ作成入門


## 1. Tornadoの紹介

Tornadoは、非同期I/Oを活用したPythonのWebフレームワークです。高いパフォーマンスとスケーラビリティを提供し、リアルタイムWebサービスに適しています。

## 2. インストールとセットアップ

Tornadoのインストールは非常に簡単です。以下のコマンドを使用します。

```bash
pip install tornado
```

これでTornadoをプロジェクトに追加できます。

## 3. Hello Worldアプリケーション

基本的な「Hello, World」アプリを作成してみましょう。

```python
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アプリケーションに適しています。

```python
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ルーティングを設定し、アプリケーション全体を管理します。

```python
class MyHandler(tornado.web.RequestHandler):
    def get(self):
        self.write("This is MyHandler")

app = tornado.web.Application([
    (r"/my", MyHandler),
])
```

## 6. Tornadoでのルーティング

ルーティングは、URLパターンに基づいて適切なハンドラーを選択します。

```python
app = tornado.web.Application([
    (r"/", MainHandler),
    (r"/about", AboutHandler),
])
```

- **URLパターン**: 正規表現を使用してURLを指定。

## 7. テンプレートの使用

Tornadoのテンプレートシステムを使用して動的なHTMLを生成できます。

```html
# template.html
<html>
<body>
    <h1>{{ title }}</h1>
    <p>{{ content }}</p>
</body>
</html>
```

```python
class TemplateHandler(tornado.web.RequestHandler):
    def get(self):
        self.render("template.html", title="Hello", content="Welcome to Tornado")
```

- **render**: テンプレートをレンダリングし、クライアントに送信。

## 8. フォームと入力の処理

フォームデータを処理する方法を学びます。

```python
class FormHandler(tornado.web.RequestHandler):
    def post(self):
        name = self.get_argument("name")
        self.write(f"Hello, {name}")
```

- **get_argument**: フォームやクエリパラメータからデータを取得。

## 9. WebSocketsとリアルタイムアプリケーション

WebSocketsを使用してリアルタイム通信を実現します。

```python
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との統合例を示します。

```python
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保護です。

```python
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. エラーハンドリングとデバッグ

エラーハンドリングを適切に行うことで、アプリケーションの信頼性を向上させます。

```python
class ErrorHandler(tornado.web.RequestHandler):
    def get(self):
        try:
            result = 1 / 0
        except ZeroDivisionError:
            self.write("Error: Division by zero")
```

- **try/except**: 例外をキャッチして処理。

## 13. Tornadoアプリケーションのテスト

テストはアプリケーションの品質を保証します。

```python
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`を使用したデプロイ。

```bash
gunicorn myapp:app --bind 0.0.0.0:8888
```

- **gunicorn**: Python WSGI HTTPサーバー。

## 15. 高度なトピックとベストプラクティス

スケーラビリティとパフォーマンスの向上のためのベストプラクティスを学びます。

- **非同期タスクキュー**: Celeryなどを使用してバックグラウンドタスクを管理。
- **負荷分散**: 複数のインスタンスを使用してトラフィックを分散。

各章は実践的なコード例と共に、Tornadoの機能を深く理解するための手助けとなるでしょう。