せっかくPython始めたのでWebアプリの一つでも作ってみたいと思い、この本を読みながらFlaskの使い方を勉強していたんですが、正直扱いづらいなぁ・・・と感じていました。
ちょっと規模が大きくなると、Viewを機能ごとに複数のソースファイルに分けたり、機能ごとにテストを組みたくなってきて。
デコレータで手軽にroute設定できるのは利点なんですが、このappインスタンスを複数ファイルから参照するのは何か嫌だし。
1 2 3 4 5 6 7 8 9 10 11 12 |
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
すればいいんですね。これはいい!
1 2 3 4 5 6 7 8 9 10 11 |
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に対応した関数がマップされるというものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
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に置き換えました。
後から機能を付け足しやすくなって、いい感じです。
まだ使ったことがない方は、ぜひ試してみてください。