When it’s ready.

出来るまで出来ない

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
完全に忘れていた。