初めに

Pythonは、オブジェクト向けて解釈された高レベルの動的コンピュータープログラミングの言語です。

Pythonはシンプルで読みやすく、かつ強力で効率的。

そのため

  • ファイル処理
  • ネットワークプログラミング
  • データベースプログラミング
  • ゲーム
  • Web開発
  • データ分析
  • 機械学習

など、様々な分野で汎用されています。

Web開発に関しては、開発効率を向上させるためにDjango・Flask・Tornado・Web2pyなどの多くのフレームワークが登場しました。

Python Webフレームワークには多くの種類が出ていて、選択肢は多くあります。

特にTornadoは簡単に作成・拡張・展開できるため、Webアプリケーションを作成する上では素晴らしいフレームワークです。


Tornado概要

Friend Feedから生まれたフレームワーク

Friend Feedで開発されて、Pythonで記述されたWebサーバーおよびWebアプリケーションのフレームワークです。

Facebookに買収後に2009年9月にオープンソースソフトウェアとして一般に公開されています。


Tornado (フレームワーク)とは

Tornadoは、Tornado Web Serverが正式名称です。フレームワークだけでなく、Webサーバーでもあるのですね。

Webアプリケーションで使用されたWebフレームワークはweb.pyまたはGoogleのwebappに少し似っています。

しかし非ブロッキングサーバ環境を効果的に利用できるために、Webフレームワークには便利なツールと最適化も含まれています。

TornadoはWSGIに基づいていません。そのため、ほとんどのPythonWebフレームワークとは異なる点があります。

通常、他のフレームワークはプロセスごとに一つのスレッドで実行されます。

一方Tornadoは非ブロッキングサーバI/Oを使用することにより、毎秒数に数万のオープン接続に拡張と処理できます。

したがって、各ユーザーへの長時間の接続を必要とするような長いポーリングWebSocketやその他のアプリケーションに最適です。

このような点で、理想的なリアルタイムWebサービスのフレームワークともいえます。

Tornadoの強みは、非常に高速で軽量でシンプルなことです。つまり、好きなように制御できるものを構築しているように感じられるでしょう。


Tornadoのコンポネント

現在主流に使われていたWebサーバーフレームワークとは大きく異なり、Tornadoは4つの主要な構成要素に分けられます。

  • Webフレームワーク
  • HTTPのクライアント側とサーバー側の実装
  • 非同期ネットワークライブラリ(IOLoopとIOStream)
  • コルーチンライブラリ

Webフレームワークは、Webアプリケーションを作成する為のサブクラス化されたRequestHandlerと様々なサポートクラスを含みます。

HTTPのクライアント側とサーバー側の実装に、通常は通信用のHTTPServerAsyncHTTPClientを含みます。

IOLoopとIOStreamはHTTPコンポーネントの構成要素として機能し、他のプロトコルの実装にも使用されます。

コルーチンライブラリは、非同期コードをより簡単な方法で記述することができます。

TornadoフレームワークとHTTPサーバーは、共にWSGIの代わりにフルスタックをサポートしているのです。

WSGI容器でTornodoネットワークフレームもしくはTornadoHTTPサーバーのみの使用には、特定制限が設定されました。

Tornadoのパフォーマンスを最大化にするにはTornadoのネットワークフレームとTornadoHTTPサーバーを同時に使用するといいでしょう。


Tornadoの特徴

Tornadoは非常に小さなフレームワークです。

ユーザーはソースコードを簡単に読み込んで何か起こっているかを理解できる上に、明確で読みやすいドキュメントが記載しています。

アプリケーションの作成に使用できる多くの汎用的なクラスを提供できます。

例えば、ルーターやWeb SocketのSocket Handlerなどです。

また、このような特徴もあります。

  • カスタムHTMLテンプレートエンジン
  • Pythonで書かれたものに関しては非常に高速で、毎分2000件のリクエストを簡単に処理できる
  • カスタムルーティング処理―ルート作成に使用できる汎用的なクラスを提供する
  • WSGIをサポートしているものの、ユーザー達はTornadoの独自のインターフェースを使用する必要がある
  • すぐに使えるWebSocketサポート、認証(Google経由など)及びセキュリティ機能(Cookie署名やXSRF保護など)
  • REST APIの作成に追加ツールは必要なし


Tornadoのモジュールインデックス

最も重要なモジュールはWebモジュールであり、Tornadoの主な機能を含みます。

他のモジュールは、Webモジュールより便利にするためのツールのようなものです。


主なマインモジュール

web-FriendFeedが使用する基本的なWebフレームワークで、Tornadoの多数の重要な機能が含まれています。

  • escape:XHTML、JSON、URLエンコード/デコート方法
  • database(データベース):使いやすく為のMySQLdbのシンプルな実装
  • template(テンプレート):PythonベースのWebテンプレートシステム
  • httpclient:Web及びhttpserverで動作するように設計された非ブロッキングHTTPクライアントサードパーティ認証の認証実装
  • Locale(ロケール):ローカライズ化と翻訳のサポート機能
  • Options(オプション):サーバー環境向けに最適化されたオプションコマンドライン及び構成ファイル解析ツール

下モジュール

  • httpserver:Webモジュール用の非常に単純なHTTPサーバ―実装
  • iostream:一般的な読取と書込操作を容易にする非ブロッキングソケットの単純なカプセル化
  • ioloop:コアI/Oループ

Tornadoは設計した最初にパフォーマンス要因を考慮しています。

そのためC10Kの問題を解決することを目的にし、非常に高いパフォーマンスのフレームワークに設計しました。

さらに

  • セキュリティ
  • ユーザーの認証
  • ソーシャルネットワーキング
  • データベース
  • WebサイトAPIなどの外部サービス

これらとの非同期相互作用の為のツールでもあります。


C10K問題

いわゆる10,000の接続を同時に処理します。単一のサーバーだと、対応する余裕はまったくありません。

また複数のサーバーを使用して配信することは高コスト必要となるを意味します。


Tornado主な構成

TornadoWebアプリケーションの構造

TornadoWebアプリケーションは、通常一つ以上のRequestHandlerのサブクラスApplicationオブジェクトで構成されます。

アプリケーションを使用して様々な要求を対応するRequestHandlerにルーティングして、main関数でWebサービスを起動します。


Applicationクラスなどについて

Applicationクラスは、パラメーターコレクションクラスのように見えます。

これはアプリケーションの起動時に初期化され、大量なパラメータを受け入れることが可能です。

特に最も重要なのは、URLルーティングの規則定義Web操作のパラメーター等が挙げられます。


HTTPServerクラス

実行中のクラスのようにみえます。Applicationを独自のパラメータとして使用可能です。

ApplicationはHTTPServerを作成して実行するこもできます。


OLoopクラス

メッセージの循環、配信とプログラムの実際のブロックポイントです。

これらのクラスの関係図は下記となります。

基本的な実行フレームワークを構成し、全て単一インスタンスで実行されます。


HTTPリクエストの処理

HTTPリクエストの処理では、一般的に使用される関数は次のカテゴリに分類されます(RequestHandler関数の分類にも)。


  • ヘッダー(header)の処理(querystringを含む):複数のgetとset
  • ボディ(body)の処理(POST):getにはget_body_argumentを使用できます
  • Cookieの処理:複数のgetとsetを含みます。サーバー側のストレージで保存すれば、ほとんどのシナリオに適応できます。
  • リダイレクト:リダイレクト


エラー処理

プログラムにエラー発生の予測をさせることも可能です。

まずはtornado.web.HTTPErrorで発生したエラーの処理を終了させましょう。

次にRequestHandler.write_errorを呼び出して、エラーメッセとして作成されクライアント側に送信するようにします。


Tornado使い方

Pythonインストール

Tornadoを使うためには、まずはPythonをインストールします。

Pythonの公式サイトからPythonをダウンロードしてインストール。

Pythonのインストールが終わったらコマンドラインウィンドウを開いて、pythonと入力してEnterを押しましょう。

正常にインストールされれば、下記の内容が表示される筈です。

C:\Users\User>python

pyton(バージョン数)(tags/v(バージョン数):7b3ab59, (インストールした曜日と日付、自国)[MSC v.1916 64bit (AMD64)] on (対応OS))

Type “help”, “copylight”, “credits” or “license” for more Information.


Tornado インストール

Tornadoのインストール手順は簡単です。

  • 自動インストール:pipまたはeasy _installでインストール可能

pip install tornado  #Tornadoのインストールを指示

pipはPythonパッケージを管理とインターネットするツールで、いわゆるeasy_installの代替品の一つです。

tar xvzf tornado tonado-$version.tar.gz #ダウンロード済の圧縮されたTornadoを解凍します

cd tornado-$version #解凍されたファイル内に入ります

python setup.py build #インストールプログラムをコンパイルします

sudo python setup.py install #インストール

上記の手順を終えたら、Tornadoがインストールされました。次はWebアプリケーションを作成します。

下記はHello, Worldの公式の例でpythonhello.pyを実行してみたものです。

ブラウザーを開いて、http://localhost:8888/にアクセスしましょう。

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”/hello”, MainHandler),

])

 

if __name__ == “__main__”:

app = make_app()

app.listen(8888)

tornado.ioloop.IOLoop.current().start()


コード分析

上記公式の例に作成したTornadoは一切Tornadoの非同期ブロッキング機能を使っていません。

ただMainHandlerクラスを定義して、TornadoのRequestHandlerクラスを拡張するだけです。

コード分析の例は次の通りです。

  • MainHandlerクラス
  • self.write()メソッド
  • make_app()メソッド
  • app.listen(8888)
  • tornado.ioloop.IOLoop.current().start()

MainHandlerクラスはTornadoの関数リクエストの処理クラス。

リクエストを処理する時、Tornadoはこのクラスをインスタンス化し、HTTPリクエストメソッドに対応するメソッドを呼び出します。

上記の例のMainHandlerクラスはgetメソッドを定義されたものです。

HTTP要求メソッドがgetの場合、MainHandlerのgetメソッドが呼び出されて応答します。

self.write()メソッドは、文字列を関数パラメーターとして受け取り、その文字列をHTTP応答に書き込むものです。

make_app()メソッドは、TornadoのApplicationクラスのインスタンスを返します。

Applicationクラスに渡される_init_メソッドの一番重要なパラメーターはHandlersです。

このパラメーターは応答を処理するためにどのクラスを呼び出す必要があるかをTornadoアプリケーションに指示します。

例えば上記の公式例でMainHandlerのgetメソッドを呼び出す場合は、http://localhost:8888/helloにアクセスする必要があります。

app.listen(8888)は、Applicationオブジェクトの作成後、listen()メソッドを呼び出してポートでリッスンできます。

公式例のように、リスニングポートは8888です。

tornado.ioloop.IOLoop.current().start()は、TornadoのIOLoopインスタンスを作成する為に使用されます。

クライアントアクセス要求を受信と処理する為にTornadoプロジェクトを実行します。


Tornadoの適用場面

パフォーマンスを求められる場合、Tornadoはオススメです。

逆に開発速度を求められる場合、DjangoとFlask両方が適しています。

Flaskはサードパティライブラリに多くの機能を頼ってこなすので、柔軟性は抜群です。

Djangoは初心者や小さなチームの迅速な開発に適します。

管理やブログサイト、または非常複雑な機能と多くの要件をもつWebサイトに特化しているといえるでしょう。

Tornadoは高度にカスタマイズされて、訪問頻度が高い非同期Webサイトに適しています。


TornadoはDjangoやFlaskとの違いや特徴とは

Tornadoのもつ特徴は以下の通りです。

  • 高いパフォーマンスと数万の同時ユーザーを必要とするアプリケーションを構築できる
  • WebSocketや他のアプリの場合、Tornadoは理想的なWebフレームワーク

Djangoのもつ特徴は以下の通りです。

  • 汎用的なWeb開発フレームワーク
  • バッテリを含む完全な機能
  • 優れた保守性と開発速度

Flaskのもつ特徴は以下の通りです。

  • 柔軟な構成・校正には複数の方法があり、異なる環境の構成も非常に便利
  • 複数のデータベースとテンプレートとの互換性
  • 入門向け、公式ガイドを通じてFlaskの操作プロセスを明確に理解できる


まとめ

上記説明したWebフレームワークは、Pythonフレームワークの大きく幅広フレームワークのほんの一部です。

無論、各ソリューションに長所と短所があります。

機器の効率(プログラムのパフォーマンス)とプログラマーの効率(保守性・開発速度など)は矛盾するものです。

そのためどちらもとることは非常に難しいといえるでしょう。

アーキテクチャの組合の選択は、製品の特性とチームの能力によります。

学習難易度は簡単な順で見ると、Tornado>Flask>Djangoとなります。

簡潔にいうと

  • Djangoは重い・複雑なフレームワークですが、機能が豊富
  • Flaskは非常に軽量なフレームワーク。柔軟性がありますが機能が少なく、必要なプラグインの追加インストールが必要
  • TornadoはフレームワークとWebサーバー両方の側面を持ちます。非同期IOネットワークモデルを使用

しかし、FlaskとDjangoは単なるフレームワークであり、uWSGIとGunicornと連携しなければ同じ機能を実現できません。

どのフレームワークを使用するかは実際の状況によって異なります。

Pythonの詳細を深く知りたい場合は、Flaskをお勧めします。

Flaskは一番簡潔・明確・エレガントなフレームワークといえます。

単なるタスクのみをこなす場合は、Djangoがオススメです。

Django内のAdmin機能はすぐ簡単な管理インターフェイスの実装を素早くに支援できます。

もし並行性業務が必要で、WebSocketへの長接続が必要な場合はTonardoがオススメです。