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に置き換えました。
後から機能を付け足しやすくなって、いい感じです。
まだ使ったことがない方は、ぜひ試してみてください。

シェアする

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

フォローする

Close Bitnami banner
Bitnami