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