Python製WebアプリフレームワークFlaskが思っていたよりパワフルで深い。

せっかくPython始めたのでWebアプリの一つでも作ってみたいと思い、この本を読みながらFlaskの使い方を勉強していたんですが、正直扱いづらいなぁ・・・と感じていました。

ちょっと規模が大きくなると、Viewを機能ごとに複数のソースファイルに分けたり、機能ごとにテストを組みたくなってきて。

デコレータで手軽にroute設定できるのは利点なんですが、このappインスタンスを複数ファイルから参照するのは何か嫌だし。

from flask import Flask

app = Flask("hoge")

@app.route('/users/')
def show_users(page):
    users = User.query.all()
    return render_template('users.html', users=users)

if __name__ = "__main__":
    app.run(host="0.0.0.0", port=80)

何かもっと綺麗な書き方があるはずだと思ってFlaskの公式ドキュメントをみていたら、やっぱりありました。

Flask 0.7以降でサポートされたPluggable Viewというものがあります。

ビュー関数の代わりにDjangoのクラスベースの汎用ビューにインスパイアされた拡張可能なビューが導入されています。
主な目的として、カスタマイズ可能な拡張可能なビューを使って、実装の一部分を置き換えることができます。

公式ページのサンプルそのままですが、下のようにViewを継承したクラスを作っておいて、appインスタンスにadd_url_ruleすればいいんですね。これはいい!

from flask.views import View

class ShowUsers(View):
    methods = ['GET', 'POST']

    def dispatch_request(self):
        users = User.query.all()
        return render_template('users.html', objects=users)

app.add_url_rule('/users/', view_func=ShowUsers.as_view('show_users'))

Viewクラスがサポートするmethodを指定することも可能ですが、この書き方はいまいちな気が・・・

という方向けに、MethodViewクラスがあります。

これは対応するmethod名(小文字)をオーバーライドしてやれば、そのmethodに対応した関数がマップされるというものです。

from flask.views import MethodView

class UserAPI(MethodView):

    def get(self):
        users = User.query.all()
        ...

    def post(self):
        user = User.from_form_data(request.form)
        ...

app.add_url_rule('/users/', view_func=UserAPI.as_view('users'))

これならViewクラスごとにテストが書けるので、メンテナンス性も良いですね。

現在制作中のちょっとしたWebアプリは、上記View/MethodViewに置き換えました。

後から機能を付け足しやすくなって、いい感じです。

まだ使ったことがない方は、ぜひ試してみてください。

スポンサーリンク

シェアする

  • このエントリーをはてなブックマークに追加

フォローする