Falconは、Web APIサーバーの構築に特化したWebアプリケーションフレームワークです。
他のフレームワークがテンプレートエンジンやO/Rマッパなどのリッチな機能を詰め込んだ大衆車だとすれば、FalconはWeb APIサーバーに必要な機能だけにフォーカスし研ぎ澄まされた、F1マシンのようなフレームワークになっています。
特筆すべきは、そのシンプルな設計と圧倒的な速度です。
以下は公式ページに掲載のベンチマークです(2015/11/26時点、PyPy2.5.1での比較結果)。
シンプルなフレームワークと言われるFlaskの27倍、Bottleの1.5~2倍の速度で動作します。
実装も非常に簡単です。以下は、シンプルなJSONレスポンスを返すサーバーの実装例です。
python
で実行すると8000
番ポートでサーバーが立ち上がり、アクセスするとJSONレスポンスが返ってきます。
import json
import falcon
class HelloResource(object):
def on_get(self, req, resp):
msg = {
"message": "Welcome to the Falcon"
}
resp.body = json.dumps(msg)
app = falcon.API()
app.add_route("/", HelloResource())
if __name__ == "__main__":
from wsgiref import simple_server
httpd = simple_server.make_server("127.0.0.1", 8000, app)
httpd.serve_forever()
- リクエストに対しては、Resourceで処理を行う。Resourceは単なるPythonクラスで、継承などの必要はなし
- Resourceクラスでは、
on_get
、on_post
など、HTTP METHODに対応したメソッドで処理を行う -
add_route
で、どのURLパスをどのResourceクラスが担当するか設定
他にHookといういわゆるFilterを実装できる機能がありますが、基本はこれだけです。
FalconアプリケーションはWSGIアプリケーションなので、WSGIサーバーで動かすことができます。上記ではPython組み込みのsimple_server
を使っていますが、gunicornやwaitressでも動かすことができます(公式はgunicorn
を推奨していますが、Windowsの人は動かせないと思うので、waitress等を使うとよいと思います)。
用途としては、以下のようなシチュエーションに向いていると思います。
- クライアント側はJSフレームワークで構築するからテンプレートエンジンはいらない。JSONデータのやり取りをとにかく早くしたい。
- メールやセンサーデータなど、トラフィックの多いデータを高速にさばきたい(画面はそもそもない)
- シンプルなAPIサーバーを作りたいので、学習コストが高いフレームワークは勘弁
ぜひ、使ってみてその速度と手軽さを体感してもらえればと思います。