Flaskでおっきめのアプリになってきた時にモジュールで分ける方法
PythonHackathon2010.11に参加しました。redisチームに紛れてFlaskもやってました。
さて。PythonでWAFって、定番がないですよね。(良いか悪いかおいおいて)
個人的には、デカ目ならDjango、ちっさ目ならFlaskを選んでいます。とはいえ、最近はFlaskばっかりになっていますが・・
Flaskでちょいちょい色気づいてくるとドンドンURLが増えてきたり、ソースがでかくなってきます。そんな時に、Djangoだったらappに分けられるのに!とか公開したりするわけです。Flaskでも、同じようにProject内にAppが配置されるようになれば良いなぁと思っていたんですが、今日の勉強会でやり方を知りました。
flask.Flaskでappを作りますが、flask.Moduleという奴があります。それをappにURLと共に登録するとDjangoのAppの用に使うことが出来ます。
ファイル構成
. |-- main.py |-- appa | |-- __init__.py | |-- main_a.py |-- appb | |-- __init__.py | `-- main_b.py |-- main.py |-- statics | |-- css | `-- js `-- templates |-- appa | `-- a_index.html `-- appb `-- b_index.html
フォルダー内に、main.pyがあります。同階層にアプリケーションA(appa)とアプリケーションB(appb)が存在ます。それぞれのアプリには、/a と /bを割てる感じにします。
main.py
1 #!/usr/bin/env python 2 # coding:utf-8 3 4 from flask import Flask 5 from appa.main_a import appa 6 from appb.main_b import appb 7 8 app = Flask(__name__) 9 app.debug = True 10 11 12 @app.route('/') 13 def index(): 14 return 'top' 15 16 app.register_module(appa, url_prefix='/a') 17 app.register_module(appb, url_prefix='/b') 18 19 20 if __name__ == '__main__': 21 app.run()
5,6行目 各モジュール内のモジュールオブジェクトをロードします。(モジュールオブジェクトは後述)
16,17行目 各モジュールに対してURLをアサインします。各モジュール内で定義したURLには、ここで指定したprefixが付加されたURLでアクセス可能となります。
appa/main_a.py
#!/usr/bin/env python # coding:utf-8 from flask import Module, render_template appa = Module(__name__) @appa.route('/') def app_a_index(): p = {} return render_template('appa/a_index.html', p = {})
main.pyでは、Flaskクラスでappを作りますが、ここではModuleクラスでappaをつくっています。ディスパッチ用のデコレータは、ココで作ったモジュールappaのrouteメソッドにURLを登録します。>@appa.route('/hoge')
テンプレートと静的ファイル
各モジュール内に”templates” フォルダを作ってもrender_template() での指定の仕方が分からなかったので、トップのtemplates内に各モジュール名のフォルダを掘ってテンプレートhtmlを作成しています。静的ファイルは、今までどおり。
追加日本語情報
http://a2c.bitbucket.org/flask/patterns/packages.html
完全に忘れていた。