Posted at
PythonDay 4

Falconで光速のWeb APIサーバーを構築する

More than 3 years have passed since last update.

Falconは、Web APIサーバーの構築に特化したWebアプリケーションフレームワークです。

他のフレームワークがテンプレートエンジンやO/Rマッパなどのリッチな機能を詰め込んだ大衆車だとすれば、FalconはWeb APIサーバーに必要な機能だけにフォーカスし研ぎ澄まされた、F1マシンのようなフレームワークになっています。

Falcon Official Page

特筆すべきは、そのシンプルな設計と圧倒的な速度です。

以下は公式ページに掲載のベンチマークです(2015/11/26時点、PyPy2.5.1での比較結果)。

benchmark.PNG

シンプルなフレームワークと言われるFlaskの27倍、Bottleの1.5~2倍の速度で動作します。

実装も非常に簡単です。以下は、シンプルなJSONレスポンスを返すサーバーの実装例です。

pythonで実行すると8000番ポートでサーバーが立ち上がり、アクセスするとJSONレスポンスが返ってきます。


example.py

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_geton_postなど、HTTP METHODに対応したメソッドで処理を行う


  • add_routeで、どのURLパスをどのResourceクラスが担当するか設定

他にHookといういわゆるFilterを実装できる機能がありますが、基本はこれだけです。

FalconアプリケーションはWSGIアプリケーションなので、WSGIサーバーで動かすことができます。上記ではPython組み込みのsimple_serverを使っていますが、gunicornやwaitressでも動かすことができます(公式はgunicornを推奨していますが、Windowsの人は動かせないと思うので、waitress等を使うとよいと思います)。



  • gunicorn ※Windows対応のIssueは上がっているが、2015/11/26現在ではまだ


  • waitress pure-PythonのWSGIサーバー。速い。

用途としては、以下のようなシチュエーションに向いていると思います。


  • クライアント側はJSフレームワークで構築するからテンプレートエンジンはいらない。JSONデータのやり取りをとにかく早くしたい。

  • メールやセンサーデータなど、トラフィックの多いデータを高速にさばきたい(画面はそもそもない)

  • シンプルなAPIサーバーを作りたいので、学習コストが高いフレームワークは勘弁

ぜひ、使ってみてその速度と手軽さを体感してもらえればと思います。