PythonのWebフレームワーク - Falcon(1)

仕事以外でWebアプリを作るかも、という話になっていて、言語もフレームワークも自由なのでどーしよーかな、と迷っているところです。こういう場合はだいたい、作り慣れている、業務で経験あるものを選ぶのが手堅いというのは分かりつつ、技術者のサガとしては新しいものを求めてやまないわけです。

そんな中、PythonはいいとしてFlask以外にも何かないんかいな、ということで最近流行ってるフレームワークを検索してみました。こういう時には大抵、英語で書かれたブログが出てきますよね。New Python Web Framework in 2020、みたいな。日本語の記事よりも広範囲な内容のことが多い気がする。別にFlaskが嫌とかではないんですが、Micro frameworkの中ではけっこうクセ強いじゃない?と何年か使ってみて感じたので、もう少しプレーンなやつはないんかな、と感じてのことです。

falcon.readthedocs.io

というわけで、まずはFalconを選んでみました。雑に眺めた感じだと、brazing fastを押してる感?Pypy引っ張り出してきて他のフレームワークより早いことを強調しているように見えます。

At a glance

ルーティング

パス文字列とエンドポイント用クラスとの対応という素直な指定方法。クラスの中にHTTPメソッドごとにメソッドを持たせる(def on_getがGETで呼ばれる)。クラスは呼出可能オブジェクトならなんでもいけるんでしょうか。

api.add_route('/images', images)

HookとMiddleware

デコレータで基本処理の前後に処理を付け足せます、というデコレータの使い方の見本みたいな機能。ミドルウェアwsgiと同じ意味なのでこれも素直な機能。Extensibleを謳っているのはこの部分?

def validate_image_type(req, resp, resource, params):
    if req.content_type not in ALLOWED_IMAGE_TYPES:
        msg = 'Image type not allowed. Must be PNG, JPEG, or GIF'
        raise falcon.HTTPBadRequest('Bad request', msg)

@falcon.before(validate_image_type)
def on_post(self, req, resp):
    # ...

URLのパラメータ化

Flaskであんまり好きじゃない仕様ですが、ここはいい感じの記法っぽい。というか最近のWAFはだいたいそこらへんは改善されているイメージ。

Note:
Falcon also supports more complex parameterized path segments that contain multiple values. For example, a version control API might use the following route template for diffing two code branches:

/repos/{org}/{repo}/compare/{usr0}:{branch0}...{usr1}:{branch1}

例外でHTTPエラー

ちゃんと見てないけど、結構な分量がチュートリアルでこの話題に対して割かれている。関係ないけどTDDも重視しているっぽい。

テンプレートもORMもなし

まあ、microframeworkを標榜しているのでそりゃそうかと思いつつ、Flaskみたいにjinja使えますみたいな例示もなく、本当にJSONを返すサーバとしての内容がドキュメントのほとんどを占めている。というかテンプレートの説明が薄いことに関しては、フロントでかなりの部分をまかなえる時代なので、そりゃそうかもなという気持ちにもなる。

もうちょっと調べてみる?

というか全部素直なので、学習コスト低い。徹底している。あとはこれだけだと実用に耐えないので、そこをどう補っているのか、というmicroならではの課題をどうするのか、もう少しつっこんで調べてみようと思う。